/*
* Copyright (c) 2016 Washington State Department of Transportation
*
* 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, or
* (at your option) any later version.
*
* 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 gov.wa.wsdot.mobile.client.activities.mountainpasses;
import com.google.code.gwt.database.client.GenericRow;
import com.google.code.gwt.database.client.service.DataServiceException;
import com.google.code.gwt.database.client.service.ListCallback;
import com.google.code.gwt.database.client.service.VoidCallback;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.place.shared.Place;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.web.bindery.event.shared.EventBus;
import com.googlecode.mgwt.mvp.client.MGWTAbstractActivity;
import gov.wa.wsdot.mobile.client.ClientFactory;
import gov.wa.wsdot.mobile.client.activities.camera.CameraPlace;
import gov.wa.wsdot.mobile.client.event.ActionEvent;
import gov.wa.wsdot.mobile.client.event.ActionNames;
import gov.wa.wsdot.mobile.client.plugins.accessibility.Accessibility;
import gov.wa.wsdot.mobile.client.plugins.analytics.Analytics;
import gov.wa.wsdot.mobile.client.service.WSDOTContract.MountainPassesColumns;
import gov.wa.wsdot.mobile.client.service.WSDOTDataService;
import gov.wa.wsdot.mobile.client.util.Consts;
import gov.wa.wsdot.mobile.shared.CameraItem;
import gov.wa.wsdot.mobile.shared.ForecastItem;
import gov.wa.wsdot.mobile.shared.MountainPassItem;
import java.util.ArrayList;
import java.util.List;
public class MountainPassDetailsActivity extends MGWTAbstractActivity implements
MountainPassDetailsView.Presenter {
private final ClientFactory clientFactory;
private final MountainPassDetailsView view;
private EventBus eventBus;
private WSDOTDataService dbService;
private Analytics analytics;
private Accessibility accessibility;
private static List<MountainPassItem> mountainPassItems = new ArrayList<MountainPassItem>();
private static List<CameraItem> cameraItems = new ArrayList<CameraItem>();
private static List<ForecastItem> forecastItems = new ArrayList<ForecastItem>();
private boolean isStarred = false;
private static int lastTab = 0;
public MountainPassDetailsActivity(ClientFactory clientFactory) {
this.clientFactory = clientFactory;
view = clientFactory.getMountainPassDetailsView();
}
@Override
public void start(AcceptsOneWidget panel, final EventBus eventBus) {
dbService = clientFactory.getDbService();
analytics = clientFactory.getAnalytics();
accessibility = clientFactory.getAccessibility();
this.eventBus = eventBus;
view.setPresenter(this);
Place place = clientFactory.getPlaceController().getWhere();
if (place instanceof MountainPassDetailsPlace) {
MountainPassDetailsPlace mountainPassDetailsPlace = (MountainPassDetailsPlace) place;
final String mountainPassId = mountainPassDetailsPlace.getId();
dbService.getMountainPass(mountainPassId, new ListCallback<GenericRow>() {
@Override
public void onFailure(DataServiceException error) {
}
@Override
public void onSuccess(List<GenericRow> result) {
mountainPassItems.clear();
cameraItems.clear();
forecastItems.clear();
CameraItem c;
ForecastItem f;
isStarred = result.get(0).getInt(MountainPassesColumns.MOUNTAIN_PASS_IS_STARRED) != 0;
mountainPassItems.add(new MountainPassItem(
Integer.parseInt(mountainPassId),
result.get(0)
.getInt(MountainPassesColumns.MOUNTAIN_PASS_IS_STARRED)));
String mountainPassName = result.get(0).getString(MountainPassesColumns.MOUNTAIN_PASS_NAME);
String dateUpdated = result.get(0).getString(MountainPassesColumns.MOUNTAIN_PASS_DATE_UPDATED);
String weatherCondition = result.get(0).getString(MountainPassesColumns.MOUNTAIN_PASS_WEATHER_CONDITION);
if (weatherCondition.equals("")) weatherCondition = "Not available";
String temperature = result.get(0).getString(MountainPassesColumns.MOUNTAIN_PASS_TEMPERATURE);
String temperatureInFahrenheit;
if (temperature == null) {
temperatureInFahrenheit = "Not available";
} else {
temperatureInFahrenheit = temperature.toString() + "\u00b0F";
}
String elevationInFeet = result.get(0).getString(MountainPassesColumns.MOUNTAIN_PASS_ELEVATION);
String roadCondition = result.get(0).getString(MountainPassesColumns.MOUNTAIN_PASS_ROAD_CONDITION);
String restrictionOneTravelDirection = result.get(0).getString(MountainPassesColumns.MOUNTAIN_PASS_RESTRICTION_ONE_DIRECTION);
String restrictionOneText = result.get(0).getString(MountainPassesColumns.MOUNTAIN_PASS_RESTRICTION_ONE);
String restrictionTwoTravelDirection = result.get(0).getString(MountainPassesColumns.MOUNTAIN_PASS_RESTRICTION_TWO_DIRECTION);
String restrictionTwoText = result.get(0).getString(MountainPassesColumns.MOUNTAIN_PASS_RESTRICTION_TWO);
JSONArray cameras = JSONParser.parseStrict(result.get(0).getString(MountainPassesColumns.MOUNTAIN_PASS_CAMERA)).isArray();
int numCameras = cameras.size();
for (int i = 0; i < numCameras; i++) {
JSONObject camera = cameras.get(i).isObject();
c = new CameraItem();
c.setImageUrl(camera.get("url").isString().stringValue());
c.setCameraId(Integer.parseInt(camera.get("id").toString()));
c.setHasVideo(0);
cameraItems.add(c);
}
JSONArray forecasts = JSONParser.parseStrict(result.get(0).getString(MountainPassesColumns.MOUNTAIN_PASS_FORECAST)).isArray();
int numForecasts = forecasts.size();
for (int i = 0; i < numForecasts; i++) {
JSONObject forecast = forecasts.get(i).isObject();
f = new ForecastItem();
f.setDay(forecast.get("Day").isString().stringValue());
f.setForecastText(forecast.get("ForecastText").isString().stringValue());
f.setWeatherIcon(forecast.get("WeatherIcon").isString().stringValue());
forecastItems.add(f);
}
view.setTitle(mountainPassName);
view.toggleStarButton(isStarred);
view.setDateUpdated(dateUpdated);
view.setWeatherCondition(weatherCondition);
view.setTemperatureInFahrenheit(temperatureInFahrenheit);
view.setElevationInFeet(elevationInFeet);
view.setRoadCondition(roadCondition);
view.setRestrictionOneTravelDirection(restrictionOneTravelDirection);
view.setRestrictionOneText(restrictionOneText);
view.setRestrictionTwoTravelDirection(restrictionTwoTravelDirection);
view.setRestrictionTwoText(restrictionTwoText);
view.refreshReport();
if (forecastItems.size() == 0) {
view.removeTab(2);
} else {
view.renderForecast(forecastItems);
view.refreshForecast();
}
if (cameraItems.size() == 0) {
view.removeTab(1);
} else {
view.renderCamera(cameraItems);
view.refreshCameras();
}
}
});
}
panel.setWidget(view);
accessibility.postScreenChangeNotification();
}
@Override
public void onStop() {
view.setPresenter(null);
}
@Override
public void onBackButtonPressed() {
ActionEvent.fire(eventBus, ActionNames.BACK);
}
@Override
public void onCameraSelected(int index) {
CameraItem item = cameraItems.get(index);
clientFactory.getPlaceController().goTo(
new CameraPlace(Integer.toString(item.getCameraId())));
}
@Override
public void onStarButtonPressed() {
if (isStarred) {
mountainPassItems.get(0).setIsStarred(0);
isStarred = false;
} else {
mountainPassItems.get(0).setIsStarred(1);
isStarred = true;
}
dbService.updateStarredMountainPasses(mountainPassItems, new VoidCallback() {
@Override
public void onFailure(DataServiceException error) {
}
@Override
public void onSuccess() {
view.toggleStarButton(isStarred);
}
});
}
@Override
public void onTabSelected(int index) {
int currentTab = index;
switch(currentTab){
case 0:
if (currentTab != lastTab){
if (Consts.ANALYTICS_ENABLED) {
analytics.trackScreen("/Mountain Passes/Pass/Report");
}
}
break;
case 1:
if (currentTab != lastTab){
if (Consts.ANALYTICS_ENABLED) {
analytics.trackScreen("/Mountain Passes/Pass/Cameras");
}
}
break;
case 2:
if (currentTab != lastTab){
if (Consts.ANALYTICS_ENABLED) {
analytics.trackScreen("/Mountain Passes/Pass/Forcast");
}
}
break;
default:
}
lastTab = currentTab;
}
}