/* * 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.ferries.schedules.sailings; 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.i18n.client.DateTimeFormat; 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.json.client.JSONValue; 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.ferries.schedules.departures.FerriesRouteDeparturesPlace; 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.FerriesSchedulesColumns; import gov.wa.wsdot.mobile.client.service.WSDOTDataService; import gov.wa.wsdot.mobile.client.util.Consts; import gov.wa.wsdot.mobile.shared.FerriesRouteAlertItem; import gov.wa.wsdot.mobile.shared.FerriesRouteItem; import gov.wa.wsdot.mobile.shared.FerriesScheduleDateItem; import gov.wa.wsdot.mobile.shared.FerriesTerminalItem; import java.util.ArrayList; import java.util.Date; import java.util.List; public class FerriesRouteSailingsActivity extends MGWTAbstractActivity implements FerriesRouteSailingsView.Presenter { private final ClientFactory clientFactory; private FerriesRouteSailingsView view; private EventBus eventBus; private Analytics analytics; private Accessibility accessibility; private WSDOTDataService dbService; private static List<FerriesScheduleDateItem> scheduleDateItems = new ArrayList<FerriesScheduleDateItem>(); private static List<FerriesRouteItem> ferriesRouteItems = new ArrayList<FerriesRouteItem>(); private static List<FerriesRouteAlertItem> routeAlertItems = new ArrayList<FerriesRouteAlertItem>(); private static DateTimeFormat dateFormat = DateTimeFormat.getFormat("MMMM d, yyyy h:mm a"); private boolean isStarred = false; private static int lastTab = 0; public FerriesRouteSailingsActivity(ClientFactory clientFactory) { this.clientFactory = clientFactory; } @Override public void start(AcceptsOneWidget panel, final EventBus eventBus) { view = clientFactory.getFerriesRouteSailingsView(); accessibility = clientFactory.getAccessibility(); dbService = clientFactory.getDbService(); analytics = clientFactory.getAnalytics(); this.eventBus = eventBus; view.setPresenter(this); if (Consts.ANALYTICS_ENABLED) { analytics.trackScreen("/Ferries/Schedules/Sailings"); } Place place = clientFactory.getPlaceController().getWhere(); if (place instanceof FerriesRouteSailingsPlace) { FerriesRouteSailingsPlace ferriesRouteSchedulesDaySailingsPlace = (FerriesRouteSailingsPlace) place; String routeId = ferriesRouteSchedulesDaySailingsPlace.getId(); createTopicsList(routeId); accessibility.postScreenChangeNotification(); panel.setWidget(view); } } private void createTopicsList(final String routeId) { dbService.getFerriesSchedulesRoute(routeId, new ListCallback<GenericRow>() { @Override public void onFailure(DataServiceException error) { } @Override public void onSuccess(List<GenericRow> result) { ferriesRouteItems.clear(); scheduleDateItems.clear(); routeAlertItems.clear(); FerriesScheduleDateItem scheduleDate; FerriesTerminalItem terminal; FerriesRouteAlertItem routeAlert; view.showProgressIndicator(); isStarred = result.get(0).getInt(FerriesSchedulesColumns.FERRIES_SCHEDULE_IS_STARRED) != 0; ferriesRouteItems.add(new FerriesRouteItem( Integer.parseInt(routeId), result.get(0) .getInt(FerriesSchedulesColumns.FERRIES_SCHEDULE_IS_STARRED))); JSONValue scheduleDateValue = JSONParser.parseStrict(result.get(0).getString(FerriesSchedulesColumns.FERRIES_SCHEDULE_DATE)); JSONArray dates = scheduleDateValue.isArray(); JSONValue routeAlertValue = JSONParser.parseStrict(result.get(0).getString(FerriesSchedulesColumns.FERRIES_SCHEDULE_ALERT)); JSONArray alerts = routeAlertValue.isArray(); int numDates = dates.size(); for (int i = 0; i < numDates; i++) { scheduleDate = new FerriesScheduleDateItem(); JSONObject date = dates.get(i).isObject(); scheduleDate.setDate(date.get("Date").toString().substring(6, 19)); JSONArray sailings = date.get("Sailings").isArray(); int numSailings = sailings.size(); for (int j=0; j < numSailings; j++) { terminal = new FerriesTerminalItem(); JSONObject sailing = sailings.get(j).isObject(); terminal.setArrivingTerminalID(Integer.parseInt(sailing.get("ArrivingTerminalID").toString())); terminal.setArrivingTerminalName(sailing.get("ArrivingTerminalName").isString().stringValue()); terminal.setDepartingTerminalID(Integer.parseInt(sailing.get("DepartingTerminalID").toString())); terminal.setDepartingTerminalName(sailing.get("DepartingTerminalName").isString().stringValue()); scheduleDate.setFerriesTerminalItem(terminal); } scheduleDateItems.add(scheduleDate); } int numAlerts = alerts.size(); for (int i = 0; i < numAlerts; i++) { routeAlert = new FerriesRouteAlertItem(); JSONObject alert = alerts.get(i).isObject(); routeAlert.setBulletinID(Integer.parseInt(alert.get("BulletinID").toString())); routeAlert.setPublishDate(dateFormat .format(new Date(Long.parseLong(alert .get("PublishDate").isString().stringValue() .substring(6, 19))))); routeAlert.setAlertDescription(alert.get("AlertDescription").isString().stringValue()); routeAlert.setAlertFullTitle(alert.get("AlertFullTitle").isString().stringValue()); if (alert.get("AlertFullText").toString() != "null") { routeAlert.setAlertFullText(alert.get("AlertFullText").isString().stringValue()); } else { routeAlert.setAlertFullText(""); } routeAlertItems.add(routeAlert); } if(routeAlertItems.isEmpty()){ view.showEmptyAlertsMessage(); }else{ view.hideEmptyAlertsMessage(); } view.hideProgressIndicator(); view.toggleStarButton(isStarred); view.render(scheduleDateItems.get(0).getFerriesTerminalItem()); view.renderRouteAlerts(routeAlertItems); view.refresh(); accessibility.postScreenChangeNotification(); } }); } @Override public void onStop() { view.setPresenter(null); } @Override public void onSailingItemSelected(int index) { clientFactory.getPlaceController() .goTo(new FerriesRouteDeparturesPlace( Integer.toString(ferriesRouteItems.get(0).getRouteID()), index, scheduleDateItems.get(0).getFerriesTerminalItem() .get(index).getDepartingTerminalID())); } @Override public void onRouteAlertSelected(int index) { FerriesRouteAlertItem item = routeAlertItems.get(index); clientFactory.getPlaceController().goTo( new FerriesRouteAlertDetailsPlace(item)); } @Override public void onBackButtonPressed() { ActionEvent.fire(eventBus, ActionNames.BACK); } @Override public void onStarButtonPressed() { if (isStarred) { ferriesRouteItems.get(0).setIsStarred(0); isStarred = false; } else { ferriesRouteItems.get(0).setIsStarred(1); isStarred = true; } dbService.updateStarredFerriesSchedules(ferriesRouteItems, 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("/Ferries/Schedules/Sailings"); } } break; case 1: if (currentTab != lastTab){ if (Consts.ANALYTICS_ENABLED) { analytics.trackScreen("/Ferries/Schedules/Alerts"); } } break; default: } lastTab = currentTab; } }