/**
* Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onebusaway.webapp.gwt.mobile_application.control;
import java.util.ArrayList;
import java.util.List;
import org.onebusaway.geospatial.model.CoordinateBounds;
import org.onebusaway.geospatial.services.SphericalGeometryLibrary;
import org.onebusaway.transit_data.model.RouteBean;
import org.onebusaway.transit_data.model.RoutesBean;
import org.onebusaway.transit_data.model.SearchQueryBean;
import org.onebusaway.transit_data.model.StopsForRouteBean;
import org.onebusaway.transit_data.model.SearchQueryBean.EQueryType;
import org.onebusaway.webapp.gwt.common.control.Place;
import org.onebusaway.webapp.gwt.common.control.PlacemarkPlaceImpl;
import org.onebusaway.webapp.gwt.mobile_application.MobileApplicationContext;
import org.onebusaway.webapp.gwt.mobile_application.view.MapViewController;
import org.onebusaway.webapp.gwt.mobile_application.view.StopWithArrivalsAndDeparturesViewController;
import org.onebusaway.webapp.gwt.viewkit.NavigationController;
import org.onebusaway.webapp.gwt.viewkit.TabBarController;
import org.onebusaway.webapp.gwt.viewkit.ViewController;
import org.onebusaway.webapp.gwt.where_library.rpc.WebappServiceAsync;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.maps.client.geocode.Geocoder;
import com.google.gwt.maps.client.geocode.LocationCallback;
import com.google.gwt.maps.client.geocode.Placemark;
import com.google.gwt.maps.client.geom.LatLng;
import com.google.gwt.maps.client.geom.LatLngBounds;
import com.google.gwt.user.client.rpc.AsyncCallback;
public class Actions {
private static WebappServiceAsync _service = WebappServiceAsync.SERVICE;
public static StopWithArrivalsAndDeparturesViewController showArrivalsAndDeparturesForStop(
NavigationController controller, String stopId) {
StopWithArrivalsAndDeparturesViewController view = new StopWithArrivalsAndDeparturesViewController(
stopId);
controller.pushViewController(view);
return view;
}
public static ViewController ensureStopIsSelected(ViewController controller,
String stopId) {
NavigationController nav = controller.getNavigationController();
ViewController next = nav.getNextController(controller);
if (next != null) {
String currentStopId = Actions.getStopIdForViewController(next);
if (currentStopId != null && currentStopId.equals(stopId))
return next;
// Otherwise, clear the existing view stack
nav.popToViewController(controller);
}
return Actions.showArrivalsAndDeparturesForStop(nav, stopId);
}
public static String getStopIdForViewController(ViewController viewController) {
if (!(viewController instanceof StopWithArrivalsAndDeparturesViewController))
return null;
StopWithArrivalsAndDeparturesViewController vc = (StopWithArrivalsAndDeparturesViewController) viewController;
return vc.getStopId();
}
public static void searchForRoute(String route) {
switchToMapView();
CoordinateBounds bounds = getSearchBounds(20 * 1000);
SearchQueryBean query = new SearchQueryBean();
query.setQuery(route);
query.setMaxCount(10);
query.setBounds(bounds);
query.setType(EQueryType.BOUNDS_OR_CLOSEST);
_service.getRoutes(query, new RoutesHandler());
}
public static void searchForAddress(String address) {
switchToMapView();
Geocoder geocoder = new Geocoder();
geocoder.setViewport(getSearchBoundsAsLatLngBounds(20 * 1000));
geocoder.getLocations(address, new AddressHandler());
}
public void searchForStop(String stopCode) {
}
/****
* Private Methods
****/
private static void switchToMapView() {
TabBarController rootController = MobileApplicationContext.getRootController();
rootController.setSelectedIndex(0);
}
private static LatLngBounds getSearchBoundsAsLatLngBounds(double radius) {
CoordinateBounds bounds = getSearchBounds(radius);
LatLngBounds b = LatLngBounds.newInstance();
b.extend(LatLng.newInstance(bounds.getMinLat(), bounds.getMinLon()));
b.extend(LatLng.newInstance(bounds.getMaxLat(), bounds.getMaxLon()));
return b;
}
private static CoordinateBounds getSearchBounds(double radius) {
LocationManager locationManager = MobileApplicationContext.getLocationManager();
LatLng p = locationManager.getCurrentSearchLocation();
CoordinateBounds bounds = SphericalGeometryLibrary.bounds(p.getLatitude(),
p.getLongitude(), radius);
System.out.println(bounds);
return bounds;
}
private static class RoutesHandler implements AsyncCallback<RoutesBean> {
@Override
public void onSuccess(RoutesBean routesBean) {
List<RouteBean> routes = routesBean.getRoutes();
if (routes.size() == 1) {
RouteBean route = routes.get(0);
System.out.println("route found: " + route.getShortName() + " "
+ route.getLongName());
_service.getStopsForRoute(route.getId(),
new StopsForRouteHandler(route));
} else {
TabBarController rootController = MobileApplicationContext.getRootController();
rootController.setSelectedIndex(0);
}
}
@Override
public void onFailure(Throwable arg0) {
}
}
private static class StopsForRouteHandler implements
AsyncCallback<StopsForRouteBean> {
private RouteBean _route;
public StopsForRouteHandler(RouteBean route) {
_route = route;
}
@Override
public void onSuccess(StopsForRouteBean stopsForRoute) {
TabBarController rootController = MobileApplicationContext.getRootController();
rootController.setSelectedIndex(0);
System.out.println("showing stops for route");
MapViewController map = MobileApplicationContext.getMapViewController();
map.showStopsForRoute(_route, stopsForRoute);
}
@Override
public void onFailure(Throwable arg0) {
}
}
private static class AddressHandler implements LocationCallback {
@Override
public void onSuccess(JsArray<Placemark> locations) {
List<Place> places = new ArrayList<Place>();
for (int i = 0; i < locations.length(); i++)
places.add(new PlacemarkPlaceImpl(locations.get(i)));
MapViewController map = MobileApplicationContext.getMapViewController();
if (places.size() == 0) {
} else if (places.size() == 1) {
map.showPlace(places.get(0));
} else {
map.showPlaces(places);
}
}
@Override
public void onFailure(int statusCode) {
}
}
}