From af6e1e41974bb1ba18670394d2d73c44c997f0b1 Mon Sep 17 00:00:00 2001 From: Armin Zamani Date: Wed, 29 May 2013 00:48:34 +0200 Subject: [PATCH 001/140] the settings are now settable via the RegattaOverview URL --- .../RegattaOverviewEntryPoint.java | 40 +++++++++-- .../regattaoverview/RegattaOverviewPanel.java | 5 +- .../RegattaRaceStatesComparator.java | 4 +- .../RegattaRaceStatesComponent.java | 72 +++++++++++++------ ...attaRaceStatesSettingsDialogComponent.java | 12 ++-- .../gwt/ui/server/SailingServiceImpl.java | 3 +- .../ui/shared/RegattaOverviewEntryDTO.java | 3 +- 7 files changed, 101 insertions(+), 38 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewEntryPoint.java index e5d61d9cf04..95466a1bc06 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewEntryPoint.java @@ -1,5 +1,8 @@ package com.sap.sailing.gwt.ui.regattaoverview; +import java.util.ArrayList; +import java.util.List; + import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.RootPanel; @@ -8,6 +11,12 @@ import com.sap.sailing.gwt.ui.client.LogoAndTitlePanel; public class RegattaOverviewEntryPoint extends AbstractEntryPoint { + private final static String PARAM_EVENT = "event"; + private final static String PARAM_ONLY_RUNNING_RACES = "onlyrunningraces"; + private final static String PARAM_ONLY_RACES_OF_SAME_DAY = "onlyracesofsameday"; + private final static String PARAM_REGATTA = "regatta"; + private final static String PARAM_COURSE_AREA = "coursearea"; + @Override public void doOnModuleLoad() { super.doOnModuleLoad(); @@ -23,10 +32,33 @@ public class RegattaOverviewEntryPoint extends AbstractEntryPoint { RootPanel.getBodyElement().getStyle().setPadding(0, Unit.PX); RootPanel.getBodyElement().getStyle().setPaddingTop(20, Unit.PX); } - String eventIdAsString = Window.Location.getParameter("event"); - - RegattaOverviewPanel regattaOverviewPanel = new RegattaOverviewPanel(sailingService, this, stringMessages, eventIdAsString); + + String eventIdAsString = Window.Location.getParameter(PARAM_EVENT); + + RegattaRaceStatesSettings settings = createRegattaRaceStatesSettingsFromURL(); + + RegattaOverviewPanel regattaOverviewPanel = new RegattaOverviewPanel(sailingService, this, stringMessages, eventIdAsString, settings); rootPanel.add(regattaOverviewPanel); } -} + private RegattaRaceStatesSettings createRegattaRaceStatesSettingsFromURL() { + List visibleCourseAreas = new ArrayList(); + List visibleRegattas = new ArrayList(); + + boolean showOnlyCurrentlyRunningRaces = Window.Location.getParameter(PARAM_ONLY_RUNNING_RACES) != null + && Window.Location.getParameter(PARAM_ONLY_RUNNING_RACES).equalsIgnoreCase("true"); + + boolean showOnlyRacesOfSameDay = Window.Location.getParameter(PARAM_ONLY_RACES_OF_SAME_DAY) != null + && Window.Location.getParameter(PARAM_ONLY_RACES_OF_SAME_DAY).equalsIgnoreCase("true"); + + if (Window.Location.getParameterMap().containsKey(PARAM_COURSE_AREA)) { + visibleCourseAreas.addAll(Window.Location.getParameterMap().get(PARAM_COURSE_AREA)); + } + + if (Window.Location.getParameterMap().containsKey(PARAM_REGATTA)) { + visibleRegattas.addAll(Window.Location.getParameterMap().get(PARAM_REGATTA)); + } + + return new RegattaRaceStatesSettings(visibleCourseAreas, visibleRegattas, showOnlyRacesOfSameDay, showOnlyCurrentlyRunningRaces); + } +} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewPanel.java index 8d369db07ef..77088a9e242 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaOverviewPanel.java @@ -64,7 +64,8 @@ public class RegattaOverviewPanel extends SimplePanel implements RegattaOverview private static final String STYLE_VENUE_LABEL = STYLE_NAME_PREFIX + "VenueLabel"; private static final String STYLE_CLOCK_LABEL = STYLE_NAME_PREFIX + "ClockLabel"; - public RegattaOverviewPanel(SailingServiceAsync sailingService, final ErrorReporter errorReporter, final StringMessages stringMessages, String eventIdAsString) { + public RegattaOverviewPanel(SailingServiceAsync sailingService, final ErrorReporter errorReporter, final StringMessages stringMessages, + String eventIdAsString, RegattaRaceStatesSettings settings) { this.sailingService = sailingService; this.stringMessages = stringMessages; this.eventIdAsString = eventIdAsString; @@ -93,7 +94,7 @@ public class RegattaOverviewPanel extends SimplePanel implements RegattaOverview raceSelectionProvider.addRegattaOverviewRaceSelectionChangeListener(this); regattaRaceStatesComponent = new RegattaRaceStatesComponent(sailingService, errorReporter, stringMessages, eventIdAsString, - raceSelectionProvider, this); + raceSelectionProvider, this, settings); grid.setWidget(1, 0, regattaRaceStatesComponent); raceCourseComposite = new RaceCourseComposite(sailingService, errorReporter, stringMessages); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaRaceStatesComparator.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaRaceStatesComparator.java index 6d9fd0f2b55..1810338f577 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaRaceStatesComparator.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaRaceStatesComparator.java @@ -11,8 +11,8 @@ public class RegattaRaceStatesComparator implements Comparator regattaNames; private static RegattaRaceStatesTableResources tableRes = GWT.create(RegattaRaceStatesTableResources.class); public RegattaRaceStatesComponent(final SailingServiceAsync sailingService, ErrorReporter errorReporter, final StringMessages stringMessages, final String eventIdAsString, final RegattaOverviewRaceSelectionProvider raceSelectionProvider, - final EventProvider eventProvider) { + final EventProvider eventProvider, RegattaRaceStatesSettings settings) { this.sailingService = sailingService; this.stringMessages = stringMessages; this.eventIdAsString = eventIdAsString; this.raceSelectionProvider = raceSelectionProvider; this.eventProvider = eventProvider; this.flagImageResolver = new FlagImageResolver(); + regattaNames = new HashMap(); + this.allEntries = new ArrayList(); - settings = new RegattaRaceStatesSettings();//TODO initialize settings properly + this.settings = new RegattaRaceStatesSettings(); + updateSettings(settings); mainPanel = new VerticalPanel(); setWidth("100%"); @@ -132,8 +139,8 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component String currentFleetName = ""; int numberOfFinishedRacesOfCurrentRegattaFleet = 0; for (RegattaOverviewEntryDTO entry : filteredEntries) { - if (!currentRegattaName.equals(entry.regattaName) || !currentFleetName.equals(entry.raceInfo.fleetName)) { - currentRegattaName = entry.regattaName; + if (!currentRegattaName.equals(entry.regattaDisplayName) || !currentFleetName.equals(entry.raceInfo.fleetName)) { + currentRegattaName = entry.regattaDisplayName; currentFleetName = entry.raceInfo.fleetName; numberOfFinishedRacesOfCurrentRegattaFleet = 0; } @@ -159,14 +166,21 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component private List getFilteredRegattaRaces(List raceList) { List filteredEntries = new ArrayList(raceList); - for (RegattaOverviewEntryDTO entry : raceList) { - if (!settings.getVisibleCourseAreas().contains(entry.courseAreaIdAsString)) { - filteredEntries.remove(entry); - continue; - } - if (!settings.getVisibleRegattas().contains(entry.regattaName)) { - filteredEntries.remove(entry); - continue; + if (!settings.getVisibleCourseAreas().isEmpty() || !settings.getVisibleRegattas().isEmpty()) { + for (RegattaOverviewEntryDTO entry : raceList) { + if (!settings.getVisibleCourseAreas().isEmpty()) { + if (!settings.getVisibleCourseAreas().contains(entry.courseAreaIdAsString)) { + filteredEntries.remove(entry); + continue; + } + } + + if (!settings.getVisibleRegattas().isEmpty()) { + if (!settings.getVisibleRegattas().contains(entry.regattaName)) { + filteredEntries.remove(entry); + continue; + } + } } } @@ -224,7 +238,7 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component TextColumn regattaNameColumn = new TextColumn() { @Override public String getValue(RegattaOverviewEntryDTO entryDTO) { - return entryDTO.regattaName; + return entryDTO.regattaDisplayName; } }; regattaNameColumn.setSortable(true); @@ -232,7 +246,7 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component @Override public int compare(RegattaOverviewEntryDTO left, RegattaOverviewEntryDTO right) { - return left.regattaName.compareTo(right.regattaName); + return left.regattaDisplayName.compareTo(right.regattaDisplayName); } }); @@ -390,11 +404,12 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component return allEntries; } - public List getRegattaNames() { - List regattaNames = new ArrayList(); - for (RegattaOverviewEntryDTO entry : allEntries) { - if (!regattaNames.contains(entry.regattaName)) { - regattaNames.add(entry.regattaName); + public Map getRegattaNames() { + if (this.regattaNames.isEmpty()) { + for (RegattaOverviewEntryDTO entry : allEntries) { + if (!regattaNames.containsValue(entry.regattaDisplayName)) { + regattaNames.put(entry.regattaName, entry.regattaDisplayName); + } } } return regattaNames; @@ -446,7 +461,7 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component public SettingsDialogComponent getSettingsDialogComponent() { return new RegattaRaceStatesSettingsDialogComponent(settings, stringMessages, Collections.unmodifiableList(eventProvider.getEvent().venue.getCourseAreas()), - Collections.unmodifiableList(getRegattaNames())); + Collections.unmodifiableMap(getRegattaNames())); } @Override @@ -454,11 +469,21 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component if (!settings.getVisibleCourseAreas().equals(newSettings.getVisibleCourseAreas())) { settings.getVisibleCourseAreas().clear(); settings.getVisibleCourseAreas().addAll(newSettings.getVisibleCourseAreas()); + + if (settings.getVisibleCourseAreas().isEmpty()) { + for (CourseAreaDTO courseArea : eventProvider.getEvent().venue.getCourseAreas()) { + settings.getVisibleCourseAreas().add(courseArea.id); + } + } } if (!settings.getVisibleRegattas().equals(newSettings.getVisibleRegattas())) { settings.getVisibleRegattas().clear(); settings.getVisibleRegattas().addAll(newSettings.getVisibleRegattas()); + + if (settings.getVisibleRegattas().isEmpty()) { + settings.getVisibleRegattas().addAll(getRegattaNames().values()); + } } if (settings.isShowOnlyRacesOfSameDay() != newSettings.isShowOnlyRacesOfSameDay()) { @@ -468,7 +493,10 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component if (settings.isShowOnlyCurrentlyRunningRaces() != newSettings.isShowOnlyCurrentlyRunningRaces()) { settings.setShowOnlyCurrentlyRunningRaces(newSettings.isShowOnlyCurrentlyRunningRaces()); } - updateTable(allEntries); + //do not update the table when the entries are not loaded yet + if (!allEntries.isEmpty()) { + updateTable(allEntries); + } } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaRaceStatesSettingsDialogComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaRaceStatesSettingsDialogComponent.java index b67c6b6a403..224c4d3280c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaRaceStatesSettingsDialogComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaRaceStatesSettingsDialogComponent.java @@ -24,7 +24,7 @@ public class RegattaRaceStatesSettingsDialogComponent implements SettingsDialogC private final StringMessages stringMessages; private final RegattaRaceStatesSettings initialSettings; private final List courseAreas; - private final List regattaNames; + private final Map regattaNames; private CheckBox showOnlyRacesOfSameDayCheckBox; private CheckBox showOnlyCurrentlyRunningRacesCheckBox; @@ -34,7 +34,7 @@ public class RegattaRaceStatesSettingsDialogComponent implements SettingsDialogC private final static String SETTINGS_DIALOG_COMPONENT = "SettingsDialogComponent"; public RegattaRaceStatesSettingsDialogComponent(RegattaRaceStatesSettings settings, StringMessages stringMessages, - List courseAreas, List regattaNames) { + List courseAreas, Map regattaNames) { this.stringMessages = stringMessages; this.initialSettings = settings; this.courseAreas = courseAreas; @@ -95,10 +95,10 @@ public class RegattaRaceStatesSettingsDialogComponent implements SettingsDialogC Grid regattaGrid = new Grid(numberOfRequiredRows, maxRegattasPerRow); regattaNamesPanel.add(regattaGrid); - for (String regattaName : regattaNames) { - CheckBox checkBox = dialog.createCheckbox(regattaName); - checkBox.setValue(Util.contains(initialSettings.getVisibleRegattas(), regattaName)); - regattaCheckBoxMap.put(regattaName, checkBox); + for (Entry regattaNameEntry : regattaNames.entrySet()) { + CheckBox checkBox = dialog.createCheckbox(regattaNameEntry.getValue()); + checkBox.setValue(Util.contains(initialSettings.getVisibleRegattas(), regattaNameEntry.getKey())); + regattaCheckBoxMap.put(regattaNameEntry.getKey(), checkBox); regattaGrid.setWidget(rowIndex, columnIndex++, checkBox); if(columnIndex == maxRegattasPerRow) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 59f3307d23c..69e27c26e96 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -2421,7 +2421,8 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S RegattaOverviewEntryDTO entry = new RegattaOverviewEntryDTO(); entry.courseAreaName = courseArea.getName(); entry.courseAreaIdAsString = courseArea.getId().toString(); - entry.regattaName = regattaName; + entry.regattaDisplayName = regattaName; + entry.regattaName = leaderboard.getName(); entry.raceInfo = createRaceInfoDTO(raceColumn, fleet); result.add(entry); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RegattaOverviewEntryDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RegattaOverviewEntryDTO.java index 9960fbcd027..45e3ba074a9 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RegattaOverviewEntryDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/RegattaOverviewEntryDTO.java @@ -5,8 +5,9 @@ import com.google.gwt.user.client.rpc.IsSerializable; public class RegattaOverviewEntryDTO implements IsSerializable { public String courseAreaIdAsString; public String courseAreaName; - public String regattaName; + public String regattaDisplayName; public RaceInfoDTO raceInfo; + public String regattaName; // for GWT serialization public RegattaOverviewEntryDTO() { } From 9653443db21f0a3019718bb1babfa2dfc2965ede Mon Sep 17 00:00:00 2001 From: Armin Zamani Date: Wed, 29 May 2013 01:03:24 +0200 Subject: [PATCH 002/140] worked on updating settings --- .../ui/regattaoverview/RegattaRaceStatesComponent.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaRaceStatesComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaRaceStatesComponent.java index b905779d169..2355699356c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaRaceStatesComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/regattaoverview/RegattaRaceStatesComponent.java @@ -466,23 +466,23 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component @Override public void updateSettings(RegattaRaceStatesSettings newSettings) { - if (!settings.getVisibleCourseAreas().equals(newSettings.getVisibleCourseAreas())) { + if (settings.getVisibleCourseAreas().isEmpty() || !settings.getVisibleCourseAreas().equals(newSettings.getVisibleCourseAreas())) { settings.getVisibleCourseAreas().clear(); settings.getVisibleCourseAreas().addAll(newSettings.getVisibleCourseAreas()); - if (settings.getVisibleCourseAreas().isEmpty()) { + if (settings.getVisibleCourseAreas().isEmpty() && eventProvider.getEvent() != null) { for (CourseAreaDTO courseArea : eventProvider.getEvent().venue.getCourseAreas()) { settings.getVisibleCourseAreas().add(courseArea.id); } } } - if (!settings.getVisibleRegattas().equals(newSettings.getVisibleRegattas())) { + if (settings.getVisibleRegattas().isEmpty() || !settings.getVisibleRegattas().equals(newSettings.getVisibleRegattas())) { settings.getVisibleRegattas().clear(); settings.getVisibleRegattas().addAll(newSettings.getVisibleRegattas()); if (settings.getVisibleRegattas().isEmpty()) { - settings.getVisibleRegattas().addAll(getRegattaNames().values()); + settings.getVisibleRegattas().addAll(getRegattaNames().keySet()); } } From 46f75696f1dc09534ae42c4b90e47be3f7a7d45f Mon Sep 17 00:00:00 2001 From: Fabian Tschirschnitz Date: Wed, 29 May 2013 22:55:41 +0200 Subject: [PATCH 003/140] added new views for rrs26 (finishing and finished fragment) --- .../common/racelog/StartProcedureType.java | 4 +- .../res/layout/rrs26_race_finished_view.xml | 123 +++++++++++++ .../res/layout/rrs26_race_finishing_view.xml | 146 +++++++++++++++ .../domain/startprocedure/StartProcedure.java | 4 + .../ExtremeSailingSeriesStartProcedure.java | 12 ++ .../impl/GateStartProcedure.java | 12 ++ .../impl/RRS26StartProcedure.java | 12 ++ .../impl/StartProcedureFactory.java | 5 +- .../chooser/RaceInfoFragmentChooser.java | 6 +- .../raceinfo/RRS26FinishedRaceFragment.java | 168 ++++++++++++++++++ .../raceinfo/RRS26FinishingRaceFragment.java | 159 +++++++++++++++++ 11 files changed, 642 insertions(+), 9 deletions(-) create mode 100644 mobile/com.sap.sailing.racecommittee.app/res/layout/rrs26_race_finished_view.xml create mode 100644 mobile/com.sap.sailing.racecommittee.app/res/layout/rrs26_race_finishing_view.xml create mode 100644 mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RRS26FinishedRaceFragment.java create mode 100644 mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RRS26FinishingRaceFragment.java diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/StartProcedureType.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/StartProcedureType.java index d8a75038daf..1bf5b3cbd3e 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/StartProcedureType.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/StartProcedureType.java @@ -1,8 +1,8 @@ package com.sap.sailing.domain.common.racelog; public enum StartProcedureType { - //RRS26("Fix Line Start (RRS26)"), - //GateStart("Gate Start"), + RRS26("Fix Line Start (RRS26)"), + GateStart("Gate Start"), ESS("\"Extreme Sailing Series\"-Start"); private String displayName; diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/rrs26_race_finished_view.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/rrs26_race_finished_view.xml new file mode 100644 index 00000000000..c942ef91bea --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/rrs26_race_finished_view.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/rrs26_race_finishing_view.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/rrs26_race_finishing_view.xml new file mode 100644 index 00000000000..cf035f53123 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/rrs26_race_finishing_view.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/StartProcedure.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/StartProcedure.java index 86a9a0fdea7..a4f84df8a55 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/StartProcedure.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/StartProcedure.java @@ -46,6 +46,10 @@ public interface StartProcedure { Class getRunningRaceFragment(); + Class getFinishingRaceFragment(); + + Class getFinishedRaceFragment(); + void setStartPhaseEventListener(StartPhaseEventListener listener); Pair> getNextFlagCountdownUiLabel(Context context, long millisecondsTillStart); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java index 871c8e19137..dddf616c7ce 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/ExtremeSailingSeriesStartProcedure.java @@ -26,6 +26,8 @@ import com.sap.sailing.racecommittee.app.domain.startprocedure.StartProcedure; import com.sap.sailing.racecommittee.app.domain.startprocedure.StartProcedureListener; import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment; import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.EssRunningRaceFragment; +import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.FinishedRaceFragment; +import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.FinishingRaceFragment; import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.startphase.EssStartPhaseFragment; public class ExtremeSailingSeriesStartProcedure implements StartProcedure { @@ -381,4 +383,14 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure { } } + + @Override + public Class getFinishingRaceFragment() { + return FinishingRaceFragment.class; + } + + @Override + public Class getFinishedRaceFragment() { + return FinishedRaceFragment.class; + } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java index fd3a7f9a466..856659860d7 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/GateStartProcedure.java @@ -21,6 +21,8 @@ import com.sap.sailing.racecommittee.app.domain.startprocedure.StartPhaseEventLi import com.sap.sailing.racecommittee.app.domain.startprocedure.StartProcedure; import com.sap.sailing.racecommittee.app.domain.startprocedure.StartProcedureListener; import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment; +import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.FinishedRaceFragment; +import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.FinishingRaceFragment; import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.GateStartRunningRaceFragment; import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.startphase.GateStartPhaseFragment; @@ -310,5 +312,15 @@ public class GateStartProcedure implements StartProcedure { // TODO Auto-generated method stub return null; } + + @Override + public Class getFinishingRaceFragment() { + return FinishingRaceFragment.class; + } + + @Override + public Class getFinishedRaceFragment() { + return FinishedRaceFragment.class; + } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java index 238ec6cd0a0..b71f0ad480c 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/RRS26StartProcedure.java @@ -25,6 +25,8 @@ import com.sap.sailing.racecommittee.app.domain.startprocedure.StartPhaseEventLi import com.sap.sailing.racecommittee.app.domain.startprocedure.StartProcedure; import com.sap.sailing.racecommittee.app.domain.startprocedure.StartProcedureListener; import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment; +import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.RRS26FinishedRaceFragment; +import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.RRS26FinishingRaceFragment; import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.RRS26RunningRaceFragment; import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.startphase.RRS26StartPhaseFragment; @@ -386,4 +388,14 @@ public class RRS26StartProcedure implements StartProcedure, StartModeChoosableSt } return false; } + + @Override + public Class getFinishingRaceFragment() { + return RRS26FinishingRaceFragment.class; + } + + @Override + public Class getFinishedRaceFragment() { + return RRS26FinishedRaceFragment.class; + } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/StartProcedureFactory.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/StartProcedureFactory.java index 3242f6a73ec..b8a92dc8885 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/StartProcedureFactory.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/startprocedure/impl/StartProcedureFactory.java @@ -10,11 +10,10 @@ public class StartProcedureFactory { switch (type) { case ESS: return new ExtremeSailingSeriesStartProcedure(raceLog); - //commented out for safety reasons - /*case GateStart: + case GateStart: return new GateStartProcedure(raceLog); case RRS26: - return new RRS26StartProcedure(raceLog);*/ + return new RRS26StartProcedure(raceLog); default: throw new UnsupportedOperationException("Not yet implemented start procedure."); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/chooser/RaceInfoFragmentChooser.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/chooser/RaceInfoFragmentChooser.java index 411bbb724f3..7fbdcfbdde1 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/chooser/RaceInfoFragmentChooser.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/chooser/RaceInfoFragmentChooser.java @@ -4,8 +4,6 @@ import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sailing.racecommittee.app.logging.ExLog; import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment; import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.ErrorRaceFragment; -import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.FinishedRaceFragment; -import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.FinishingRaceFragment; import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.SetStartTimeRaceFragment; public class RaceInfoFragmentChooser { @@ -21,9 +19,9 @@ public class RaceInfoFragmentChooser { case RUNNING: return createInfoFragment(managedRace.getState().getStartProcedure().getRunningRaceFragment(), managedRace); case FINISHING: - return createInfoFragment(FinishingRaceFragment.class, managedRace); + return createInfoFragment(managedRace.getState().getStartProcedure().getFinishingRaceFragment(), managedRace); case FINISHED: - return createInfoFragment(FinishedRaceFragment.class, managedRace); + return createInfoFragment(managedRace.getState().getStartProcedure().getFinishedRaceFragment(), managedRace); default: return createInfoFragment(ErrorRaceFragment.class, managedRace); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RRS26FinishedRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RRS26FinishedRaceFragment.java new file mode 100644 index 00000000000..84dd5ba89f3 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RRS26FinishedRaceFragment.java @@ -0,0 +1,168 @@ +/** + * + */ +package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo; + +import java.io.File; +import java.util.Date; + +import android.app.Activity; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.preference.PreferenceManager; +import android.provider.MediaStore; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.TextView; + +import com.sap.sailing.domain.common.TimePoint; +import com.sap.sailing.racecommittee.app.AppConstants; +import com.sap.sailing.racecommittee.app.R; +import com.sap.sailing.racecommittee.app.logging.ExLog; +import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment; +import com.sap.sailing.racecommittee.app.utils.MailHelper; + +public class RRS26FinishedRaceFragment extends RaceFragment { + + TextView headerView; + TextView startTimeView; + TextView firstBoatFinishedView; + TextView finishTimeView; + TextView timeLimitView; + TextView protestStartTimeView; + + File finisherImageFile; + static int FINISHER_IMAGE_REQUEST_CODE = 1337; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(R.layout.rrs26_race_finished_view, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + createFinisherImageFile(); + + headerView = (TextView) getView().findViewById(R.id.textFinishedRace); + startTimeView = (TextView) getView().findViewById(R.id.textFinishedRaceStarted); + firstBoatFinishedView = (TextView) getView().findViewById(R.id.textFirstBoatFinished); + finishTimeView = (TextView) getView().findViewById(R.id.textFinishedRaceEnded); + timeLimitView = (TextView) getView().findViewById(R.id.textTimeLimit); + protestStartTimeView = (TextView) getView().findViewById(R.id.textProtestStartTime); + + headerView.setText(getHeaderText()); + startTimeView.setText(getStartTimeText()); + firstBoatFinishedView.setText(getFirstBoatFinishedTimeText()); + finishTimeView.setText(getFinishTimeText()); + timeLimitView.setText(getTimeLimitText()); + protestStartTimeView.setText(getProtestStartTimeText()); + + ImageButton cameraButton = (ImageButton) getView().findViewById(R.id.buttonCamera); + cameraButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(finisherImageFile)); + startActivityForResult(intent, FINISHER_IMAGE_REQUEST_CODE); + } + }); + } + + private void createFinisherImageFile() { + File imageDirectory = new File(Environment.getExternalStorageDirectory() + AppConstants.ApplicationFolder); + imageDirectory.mkdirs(); + finisherImageFile = new File(imageDirectory, "image.jpg"); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == FINISHER_IMAGE_REQUEST_CODE) { + if (resultCode == Activity.RESULT_OK) { + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); + String recipient = preferences.getString("mailRecipientPreference", getString(R.string.settings_advanced_mail_default)); + MailHelper.send(new String[] { recipient }, + String.format("[Race Committee] %s", getRace().getId()), + String.format("Results for race %s are attached.", getRace().getId()), + Uri.fromFile(finisherImageFile), getActivity()); + } + } + } + + private CharSequence getProtestStartTimeText() { + // TODO Currently no protest time... + return getString(R.string.empty); + } + + private TimePoint getTimeLimit() { + TimePoint startTime = getRace().getState().getStartTime(); + TimePoint firstBoatTime = getRace().getState().getFinishingStartTime(); + if (startTime == null || firstBoatTime == null) { + return null; + } + return firstBoatTime.plus((long) ((firstBoatTime.asMillis() - startTime.asMillis()) * 0.75)); + } + + private CharSequence getTimeLimitText() { + TimePoint timeLimit = getTimeLimit(); + if (timeLimit != null) { + return String.format(getString(R.string.race_time_limit), getFormattedTime(timeLimit.asDate())); + } + return getString(R.string.empty); + } + + private CharSequence getFinishTimeText() { + TimePoint finishTime = getRace().getState().getFinishedTime(); + if (finishTime != null) { + return String.format("%s %s", getString(R.string.race_finished_end_time), + getFormattedTime(finishTime.asDate())); + } + return getString(R.string.empty); + } + + private CharSequence getFirstBoatFinishedTimeText() { + TimePoint firstBoatTime = getRace().getState().getFinishingStartTime(); + if (firstBoatTime != null) { + return String.format("%s %s", getString(R.string.race_first_boat_finished), + getFormattedTime(firstBoatTime.asDate())); + } + return getString(R.string.empty); + } + + private CharSequence getStartTimeText() { + TimePoint startTime = getRace().getState().getStartTime(); + if (startTime != null) { + return String.format("%s %s", getString(R.string.race_finished_start_time), + getFormattedTime(startTime.asDate())); + } + return getString(R.string.empty); + } + + private String getHeaderText() { + return String.format(String.valueOf(getText(R.string.race_finished_template)), getRace().getName()); + } + + private String getFormattedTime(Date time) { + return getFormattedTimePart(time.getHours()) + ":" + getFormattedTimePart(time.getMinutes()) + ":" + + getFormattedTimePart(time.getSeconds()); + } + + private String getFormattedTimePart(int timePart) { + return (timePart < 10) ? "0" + timePart : String.valueOf(timePart); + } + + @Override + public void onStart() { + super.onStart(); + ExLog.w(RRS26FinishedRaceFragment.class.getName(), + String.format("Fragment %s is now shown", RRS26FinishedRaceFragment.class.getName())); + } + +} diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RRS26FinishingRaceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RRS26FinishingRaceFragment.java new file mode 100644 index 00000000000..4ce36a2a436 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/RRS26FinishingRaceFragment.java @@ -0,0 +1,159 @@ +package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo; + +import java.util.Date; + +import android.app.AlertDialog; +import android.app.FragmentManager; +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.TextView; + +import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; +import com.sap.sailing.domain.common.TimePoint; +import com.sap.sailing.domain.common.racelog.Flags; +import com.sap.sailing.racecommittee.app.AppConstants; +import com.sap.sailing.racecommittee.app.R; +import com.sap.sailing.racecommittee.app.logging.ExLog; +import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment; +import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.AbortModeSelectionDialog; +import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment; + +public class RRS26FinishingRaceFragment extends RaceFragment { + + private TextView countUpTextView; + protected TextView nextFlagCountdown; + private ImageButton abortingFlagButton; + private ImageButton blueFlagButton; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(R.layout.rrs26_race_finishing_view, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + countUpTextView = (TextView) getView().findViewById(R.id.raceCountUp); + nextFlagCountdown = (TextView) getView().findViewById(R.id.nextFlagCountdown); + nextFlagCountdown.setText(getTimeLimitText()); + + blueFlagButton = (ImageButton) getView().findViewById(R.id.blueFlagButton); + abortingFlagButton = (ImageButton) getView().findViewById(R.id.abortingFlagButton); + + blueFlagButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + showRemoveBlueFlagDialog(); + } + }); + + abortingFlagButton.setOnClickListener(new OnClickListener() { + + public void onClick(View v) { + showNovemberModeDialog(); + ExLog.i(ExLog.FLAG_NOVEMBER, getRace().getId().toString(), getActivity()); + } + }); + + } + + protected void setCountdownLabels(long millisecondsSinceStart) { + setStarttimeCountupLabel(millisecondsSinceStart); + } + + private void setStarttimeCountupLabel(long millisecondsSinceStart) { + countUpTextView.setText(String.format(getActivity().getResources().getString(R.string.race_running_since_template), + prettyTimeString(millisecondsSinceStart), getRace().getName())); + } + + protected CharSequence prettyTimeString(long time) { + int secondsStart = (int) (time / 1000); + int hours = secondsStart / 3600; + int minutes = (secondsStart % 3600) / 60; + int seconds = (secondsStart % 60); + String timePattern = "%s:%s:%s"; + String secondsString = seconds < 10 ? "0" + seconds : "" + seconds; + String minutesString = minutes < 10 ? "0" + minutes : "" + minutes; + String hoursString = hours < 10 ? "0" + hours : "" + hours; + return String.format(timePattern, hoursString, minutesString, + secondsString); + } + + private TimePoint getTimeLimit() { + TimePoint startTime = getRace().getState().getStartTime(); + TimePoint firstBoatTime = getRace().getState().getFinishingStartTime(); + if (startTime == null || firstBoatTime == null) { + return null; + } + return firstBoatTime.plus((long)((firstBoatTime.asMillis() - startTime.asMillis()) * 0.75)); + } + + private CharSequence getTimeLimitText() { + TimePoint timeLimit = getTimeLimit(); + if (timeLimit != null) { + return String.format(getString(R.string.race_first_finisher_and_time_limit), + getFormattedTime(getRace().getState().getFinishingStartTime().asDate()), getFormattedTime(timeLimit.asDate())); + } + return getString(R.string.empty); + } + + private String getFormattedTime(Date time) { + return getFormattedTimePart(time.getHours()) + ":" + getFormattedTimePart(time.getMinutes()) + ":" + getFormattedTimePart(time.getSeconds()); + } + + private String getFormattedTimePart(int timePart) { + return (timePart < 10) ? "0" + timePart : String.valueOf(timePart); + } + + protected void showNovemberModeDialog() { + FragmentManager fragmentManager = getFragmentManager(); + + RaceDialogFragment fragment = new AbortModeSelectionDialog(); + + Bundle args = getRecentArguments(); + args.putString(AppConstants.FLAG_KEY, Flags.NOVEMBER.name()); + fragment.setArguments(args); + + fragment.show(fragmentManager, "dialogNovemberMode"); + } + + private void showRemoveBlueFlagDialog() { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setMessage(getActivity().getResources().getString(R.string.confirmation_blue_flag_remove)) + .setCancelable(true) + .setPositiveButton(getActivity().getResources().getString(R.string.yes), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + ExLog.i(ExLog.FLAG_BLUE_REMOVE, getRace().getId().toString(), getActivity()); + getRace().getState().getStartProcedure().setFinished(MillisecondsTimePoint.now()); + //getRace().getState().setFinishPositioningConfirmed(); + } + }) + .setNegativeButton(getActivity().getResources().getString(R.string.no), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + ExLog.i(ExLog.FLAG_BLUE_REMOVE_NO, getRace().getId().toString(), getActivity()); + dialog.cancel(); + } + }); + AlertDialog alert = builder.create(); + alert.show(); + } + + @Override + public void onStart() { + super.onStart(); + ExLog.w(RRS26FinishingRaceFragment.class.getName(), String.format("Fragment %s is now shown", RRS26FinishingRaceFragment.class.getName())); + } + + public void notifyTick() { + if (getRace().getState().getStartTime() == null) + return; + + long millisSinceStart = System.currentTimeMillis() - getRace().getState().getStartTime().asMillis(); + setCountdownLabels(millisSinceStart); + } +} From 38cf15793feea2556ce328489f7c28bc410d35a8 Mon Sep 17 00:00:00 2001 From: Fabian Tschirschnitz Date: Wed, 29 May 2013 23:56:09 +0200 Subject: [PATCH 004/140] made the flag direction arrow of the gwt transparent --- .../images/flags/flagsRacecommittee/down.png | Bin 340 -> 299 bytes .../images/flags/flagsRacecommittee/up.png | Bin 346 -> 298 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/images/flags/flagsRacecommittee/down.png b/java/com.sap.sailing.gwt.ui/images/flags/flagsRacecommittee/down.png index ad7d485a7e0efbb7b68294ef1fe9437986682e7a..ebf713b5c6fed218e18d7d6352f0aca5577ab217 100644 GIT binary patch delta 195 zcmV;!06hQH0;>X$83+ad000l0QFf6bTYs8KL_t(IPh()95I6w!Hvln+CI~-XbOtN;}M4pqZofyBvxmKU&c z17zEAs6vqKV2}V60GY4=$_6B&002ovPDHLkV1mRIMm7Kd delta 236 zcmVF#+x~{OQs)9->p+bms{BP&dUYYaW-wEu+7)#JN mj`{ijbl(_*m~(!fXC_{+NF%C;+xxNr0000@YCn!L5!%POzAONxrq~FYnLI`6l#+cJ2dm)6T zX+U5t%W^}E$>J36DS>q0r{gCAUtr$mISKnx;{GJwr!fG)Kp0z)LNsJYaYME*J*Dx s9^!Lz<->bss?;CMW8Zgt8QAhHZwsy?s*ips#{d8T07*qoM6N<$f{(UrW&i*H From 44975d5ec9748184f6a81d666c916fad27766e95 Mon Sep 17 00:00:00 2001 From: Fabian Tschirschnitz Date: Thu, 30 May 2013 00:34:37 +0200 Subject: [PATCH 005/140] added the transparent arrows also in the src dir. --- .../images/flags/flags_racecommittee/down.png | Bin 340 -> 299 bytes .../images/flags/flags_racecommittee/up.png | Bin 346 -> 298 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/client/images/flags/flags_racecommittee/down.png b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/client/images/flags/flags_racecommittee/down.png index ad7d485a7e0efbb7b68294ef1fe9437986682e7a..ebf713b5c6fed218e18d7d6352f0aca5577ab217 100644 GIT binary patch delta 195 zcmV;!06hQH0;>X$83+ad000l0QFf6bTYs8KL_t(IPh()95I6w!Hvln+CI~-XbOtN;}M4pqZofyBvxmKU&c z17zEAs6vqKV2}V60GY4=$_6B&002ovPDHLkV1mRIMm7Kd delta 236 zcmVF#+x~{OQs)9->p+bms{BP&dUYYaW-wEu+7)#JN mj`{ijbl(_*m~(!fXC_{+NF%C;+xxNr0000@YCn!L5!%POzAONxrq~FYnLI`6l#+cJ2dm)6T zX+U5t%W^}E$>J36DS>q0r{gCAUtr$mISKnx;{GJwr!fG)Kp0z)LNsJYaYME*J*Dx s9^!Lz<->bss?;CMW8Zgt8QAhHZwsy?s*ips#{d8T07*qoM6N<$f{(UrW&i*H From b73e0e5d8bf37f2907a48230534919476926e92b Mon Sep 17 00:00:00 2001 From: Armin Zamani Date: Fri, 31 May 2013 01:06:17 +0200 Subject: [PATCH 006/140] implemented an export servlet for mark positions, added serializers and deserializers for position and positioned mark, formatting for ColorDeserializer --- .../impl/ColorDeserializer.java | 15 +-- .../impl/PositionDeserializer.java | 19 +++ .../impl/PositionJsonSerializer.java | 21 +++ .../impl/PositionedMarkJsonSerializer.java | 32 +++++ .../WEB-INF/web.xml | 9 ++ .../rc/MarkPositionsJsonExportServlet.java | 120 ++++++++++++++++++ .../impl/rc/MarksJsonExportServlet.java | 2 +- 7 files changed, 209 insertions(+), 9 deletions(-) create mode 100644 java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/PositionDeserializer.java create mode 100644 java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/PositionJsonSerializer.java create mode 100644 java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/PositionedMarkJsonSerializer.java create mode 100644 java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarkPositionsJsonExportServlet.java diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/ColorDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/ColorDeserializer.java index 099d9d5a727..b78f68f840a 100644 --- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/ColorDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/ColorDeserializer.java @@ -9,12 +9,11 @@ import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; public class ColorDeserializer implements JsonDeserializer { - public Color deserialize(JSONObject object) - throws JsonDeserializationException { - Number red = (Number) object.get("r"); - Number green = (Number) object.get("g"); - Number blue = (Number) object.get("b"); - return new RGBColor(red.intValue(), green.intValue(), blue.intValue()); - } - + public Color deserialize(JSONObject object) throws JsonDeserializationException { + Number red = (Number) object.get("r"); + Number green = (Number) object.get("g"); + Number blue = (Number) object.get("b"); + return new RGBColor(red.intValue(), green.intValue(), blue.intValue()); + } + } \ No newline at end of file diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/PositionDeserializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/PositionDeserializer.java new file mode 100644 index 00000000000..b5ff1623721 --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/deserialization/impl/PositionDeserializer.java @@ -0,0 +1,19 @@ +package com.sap.sailing.server.gateway.deserialization.impl; + +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.common.Position; +import com.sap.sailing.domain.common.impl.DegreePosition; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; +import com.sap.sailing.server.gateway.serialization.impl.PositionJsonSerializer; + +public class PositionDeserializer implements JsonDeserializer { + + public Position deserialize(JSONObject object) throws JsonDeserializationException { + Number latitudeDeg = (Number) object.get(PositionJsonSerializer.FIELD_LATITUDE_DEG); + Number longitudeDeg = (Number) object.get(PositionJsonSerializer.FIELD_LONGITUDE_DEG); + return new DegreePosition(latitudeDeg.doubleValue(), longitudeDeg.doubleValue()); + } + +} \ No newline at end of file diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/PositionJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/PositionJsonSerializer.java new file mode 100644 index 00000000000..a0624ac8555 --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/PositionJsonSerializer.java @@ -0,0 +1,21 @@ +package com.sap.sailing.server.gateway.serialization.impl; + +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.common.Position; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; + +public class PositionJsonSerializer implements JsonSerializer { + public static final String FIELD_LATITUDE_DEG = "latitude_deg"; + public static final String FIELD_LONGITUDE_DEG = "longitude_deg"; + + @Override + public JSONObject serialize(Position position) { + JSONObject result = new JSONObject(); + + result.put(FIELD_LATITUDE_DEG, position.getLatDeg()); + result.put(FIELD_LONGITUDE_DEG, position.getLngDeg()); + + return result; + } +} diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/PositionedMarkJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/PositionedMarkJsonSerializer.java new file mode 100644 index 00000000000..30d237c07cb --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/PositionedMarkJsonSerializer.java @@ -0,0 +1,32 @@ +package com.sap.sailing.server.gateway.serialization.impl; + +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.base.ControlPoint; +import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.common.Position; +import com.sap.sailing.domain.common.impl.Util.Pair; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; + +public class PositionedMarkJsonSerializer implements JsonSerializer> { + public static final String FIELD_MARK = "mark"; + public static final String FIELD_POSITION = "position"; + + private final JsonSerializer markSerializer; + private final JsonSerializer positionSerializer; + + public PositionedMarkJsonSerializer(JsonSerializer markSerializer, JsonSerializer positionSerializer) { + this.markSerializer = markSerializer; + this.positionSerializer = positionSerializer; + } + + @Override + public JSONObject serialize(Pair positionedMark) { + JSONObject result = new JSONObject(); + + result.put(FIELD_MARK, markSerializer.serialize(positionedMark.getA())); + result.put(FIELD_POSITION, positionSerializer.serialize(positionedMark.getB())); + + return result; + } +} diff --git a/java/com.sap.sailing.server.gateway/WEB-INF/web.xml b/java/com.sap.sailing.server.gateway/WEB-INF/web.xml index 7d1ba633b4d..214a11d50f2 100644 --- a/java/com.sap.sailing.server.gateway/WEB-INF/web.xml +++ b/java/com.sap.sailing.server.gateway/WEB-INF/web.xml @@ -41,6 +41,15 @@ /rc/marks + + RCMarkPositions + com.sap.sailing.server.gateway.impl.rc.MarkPositionsJsonExportServlet + + + RCMarkPositions + /rc/markpositions + + RCCurrentCourse com.sap.sailing.server.gateway.impl.rc.CourseJsonExportServlet diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarkPositionsJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarkPositionsJsonExportServlet.java new file mode 100644 index 00000000000..3055c85677e --- /dev/null +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarkPositionsJsonExportServlet.java @@ -0,0 +1,120 @@ +package com.sap.sailing.server.gateway.impl.rc; + +import java.io.IOException; +import java.util.UUID; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.json.simple.JSONArray; + +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.base.impl.MillisecondsTimePoint; +import com.sap.sailing.domain.common.Distance; +import com.sap.sailing.domain.common.Position; +import com.sap.sailing.domain.common.impl.Util.Pair; +import com.sap.sailing.domain.leaderboard.Leaderboard; +import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sailing.server.RacingEventService; +import com.sap.sailing.server.gateway.AbstractJsonHttpServlet; +import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.PositionJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.PositionedMarkJsonSerializer; + +public class MarkPositionsJsonExportServlet extends AbstractJsonHttpServlet { + + private static final long serialVersionUID = -5489857104922281761L; + + public static final String PARAMS_LEADERBOARD_NAME = "leaderboard"; + public static final String PARAMS_RACE_COLUMN_NAME = "raceColumn"; + public static final String PARAMS_RACE_FLEET_NAME = "fleet"; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + String leaderboardName = request.getParameter(PARAMS_LEADERBOARD_NAME); + if (leaderboardName == null) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST, + String.format("Missing parameter '%s'.", PARAMS_LEADERBOARD_NAME)); + return; + } + + String raceColumnName = request.getParameter(PARAMS_RACE_COLUMN_NAME); + if (raceColumnName == null) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST, + String.format("Missing parameter '%s'.", PARAMS_RACE_COLUMN_NAME)); + return; + } + + String fleetName = request.getParameter(PARAMS_RACE_FLEET_NAME); + if (fleetName == null) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST, + String.format("Missing parameter '%s'.", PARAMS_RACE_FLEET_NAME)); + return; + } + + RacingEventService service = getService(); + + Leaderboard leaderboard = service.getLeaderboardByName(leaderboardName); + if (leaderboard == null) { + response.sendError(HttpServletResponse.SC_NOT_FOUND, "No such leaderboard found."); + return; + } + + RaceColumn raceColumn = leaderboard.getRaceColumnByName(raceColumnName); + if (raceColumn == null) { + response.sendError(HttpServletResponse.SC_NOT_FOUND, "No such race column found."); + return; + } + + Fleet fleet = raceColumn.getFleetByName(fleetName); + if (fleet == null) { + response.sendError(HttpServletResponse.SC_NOT_FOUND, "No such fleet found."); + return; + } + + TrackedRace trackedRace = raceColumn.getTrackedRace(fleet); + + JSONArray result = new JSONArray(); + + if (trackedRace != null) { + MarkJsonSerializer markSerializer = new MarkJsonSerializer(); + PositionJsonSerializer positionSerializer = new PositionJsonSerializer(); + PositionedMarkJsonSerializer positionedMarkSerializer = new PositionedMarkJsonSerializer(markSerializer, positionSerializer); + + //TODO propagate only marks that are on the course area of the race + //Position courseAreaCenterPosition = leaderboard.getDefaultCourseArea().getPosition(); + //Distance courseAreaRadius = leaderboard.getDefaultCourseArea().getRadius(); + for (Mark mark : trackedRace.getMarks()) { + if (toUUID(mark.getId().toString()) != null) { + Position position = trackedRace.getOrCreateTrack(mark).getEstimatedPosition(MillisecondsTimePoint.now(), false); + + //The position of the mark needs to be in the course area + //if (isMarkInCourseArea(courseAreaCenterPosition, courseAreaRadius, position)) { + result.add(positionedMarkSerializer.serialize(new Pair(mark, position))); + //} + + } + } + } + + result.writeJSONString(response.getWriter()); + response.setContentType("application/json"); + } + + @SuppressWarnings("unused") //unused since course area has no position yet + private boolean isMarkInCourseArea(Position courseAreaCenterPosition, Distance courseAreaRadius, Position position) { + return position.getDistance(courseAreaCenterPosition).compareTo(courseAreaRadius) < 0; + } + + private UUID toUUID(String value) { + try { + return UUID.fromString(value); + } catch (IllegalArgumentException iae) { + return null; + } + } +} diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java index 2860acb1d33..c8dc7b30b6d 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/MarksJsonExportServlet.java @@ -75,7 +75,7 @@ public class MarksJsonExportServlet extends AbstractJsonHttpServlet { if (trackedRace != null) { MarkJsonSerializer serializer = new MarkJsonSerializer(); - + for (Mark mark : trackedRace.getMarks()) { if (toUUID(mark.getId().toString()) != null) { result.add(serializer.serialize(mark)); From 44ce121f26df8b85bbf3ea55088bba9c9ba99001 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Fri, 31 May 2013 17:16:18 +0200 Subject: [PATCH 007/140] # added reload button # some formatting --- .../res/menu/options_menu.xml | 16 +++--- .../res/values/strings.xml | 5 ++ .../racecommittee/app/data/DataStore.java | 2 + .../app/data/InMemoryDataStore.java | 5 ++ .../app/data/handlers/DataHandler.java | 30 +++++------ .../app/data/handlers/EventsDataHandler.java | 18 +++---- .../app/ui/activities/BaseActivity.java | 15 +++--- .../app/ui/activities/LoginActivity.java | 2 - .../ui/fragments/lists/EventListFragment.java | 50 +++++++++---------- .../project.properties | 2 +- 10 files changed, 77 insertions(+), 68 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/res/menu/options_menu.xml b/mobile/com.sap.sailing.racecommittee.app/res/menu/options_menu.xml index 0c2bd8f7648..849624e9567 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/menu/options_menu.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/menu/options_menu.xml @@ -1,19 +1,19 @@ - - - - \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml index f0be8ede876..14aa9642046 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml @@ -168,4 +168,9 @@ Mail recipient used for positiong list images. Positioning mail recipient + Connection Information + Enter Wind Data + Reload + Settings + diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java index 1018bd83eee..cc9566d5aff 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/DataStore.java @@ -10,6 +10,8 @@ import com.sap.sailing.domain.base.Mark; import com.sap.sailing.racecommittee.app.domain.ManagedRace; public interface DataStore { + + public void reset(); public Collection getEvents(); public EventBase getEvent(Serializable id); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java index 3cbdb2ba6ee..eac2d253fc3 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/InMemoryDataStore.java @@ -20,6 +20,11 @@ public enum InMemoryDataStore implements DataStore { private CourseBase courseData; private InMemoryDataStore() { + reset(); + } + + @Override + public void reset() { this.eventsById = new HashMap(); this.managedRaceById = new HashMap(); this.marksById = new HashMap(); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/DataHandler.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/DataHandler.java index f05dbba58ce..d19c5647b5c 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/DataHandler.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/DataHandler.java @@ -4,19 +4,19 @@ import com.sap.sailing.racecommittee.app.data.OnlineDataManager; import com.sap.sailing.racecommittee.app.data.clients.LoadClient; public abstract class DataHandler { - protected OnlineDataManager manager; - protected LoadClient client; - - public DataHandler(OnlineDataManager manager, LoadClient client) { - this.manager = manager; - this.client = client; - } - - public void onLoaded(T data) { - client.onLoadSucceded(data); - } - - public void onFailed(Exception reason) { - client.onLoadFailed(reason); - } + protected OnlineDataManager manager; + protected LoadClient client; + + public DataHandler(OnlineDataManager manager, LoadClient client) { + this.manager = manager; + this.client = client; + } + + public void onLoaded(T data) { + client.onLoadSucceded(data); + } + + public void onFailed(Exception reason) { + client.onLoadFailed(reason); + } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/EventsDataHandler.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/EventsDataHandler.java index 251b2e702fa..41b36427264 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/EventsDataHandler.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/data/handlers/EventsDataHandler.java @@ -8,14 +8,14 @@ import com.sap.sailing.racecommittee.app.data.clients.LoadClient; public class EventsDataHandler extends DataHandler> { - public EventsDataHandler(OnlineDataManager manager, LoadClient> client) { - super(manager, client); - } - - @Override - public void onLoaded(Collection data) { - super.onLoaded(data); - manager.addEvents(data); - } + public EventsDataHandler(OnlineDataManager manager, LoadClient> client) { + super(manager, client); + } + + @Override + public void onLoaded(Collection data) { + super.onLoaded(data); + manager.addEvents(data); + } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/BaseActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/BaseActivity.java index 50e0eaa295b..66280d85e9c 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/BaseActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/BaseActivity.java @@ -16,6 +16,7 @@ import android.widget.Toast; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.R; +import com.sap.sailing.racecommittee.app.data.InMemoryDataStore; import com.sap.sailing.racecommittee.app.services.sending.EventSendingService; import com.sap.sailing.racecommittee.app.services.sending.EventSendingService.EventSendingBinder; import com.sap.sailing.racecommittee.app.services.sending.EventSendingService.EventSendingServiceLogger; @@ -68,7 +69,7 @@ public abstract class BaseActivity extends Activity { public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); - menuItemLive = menu.findItem(R.id.LiveIcon); + menuItemLive = menu.findItem(R.id.options_menu_live); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); return true; } @@ -77,16 +78,16 @@ public abstract class BaseActivity extends Activity { public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { - /* - * case R.id.SystemInfo: fadeActivity(InformationActivity.class); return true; - */ - case R.id.OptionsSettings: + case R.id.options_menu_settings: fadeActivity(SettingsActivity.class); return true; - case R.id.LiveIcon: + case R.id.options_menu_reload: + InMemoryDataStore.INSTANCE.reset(); + fadeActivity(LoginActivity.class); + return true; + case R.id.options_menu_live: Toast.makeText(this, getLiveIconText(), Toast.LENGTH_LONG).show(); return true; - case R.id.WindLog: // fadeActivity(WindActivity.class); return false; case android.R.id.home: return onHomeClicked(); default: diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java index 70ed0245ffd..47b1d6fad3a 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java @@ -50,8 +50,6 @@ public class LoginActivity extends TwoPaneActivity implements EventSelectedListe } } - // Login -> startRaceActivity(selectedCourse); - private void addEventListFragment() { FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.add(R.id.leftContainer, new EventListFragment()); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/EventListFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/EventListFragment.java index cc91a3105ca..20e4311ab92 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/EventListFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/EventListFragment.java @@ -10,33 +10,31 @@ import com.sap.sailing.racecommittee.app.ui.fragments.lists.selection.ItemSelect public class EventListFragment extends NamedListFragment { - @Override - public void onResume() { - super.onResume(); - loadItems(); - } - - @Override - protected ItemSelectedListener attachListener(Activity activity) { - if (activity instanceof EventSelectedListenerHost) { - EventSelectedListenerHost listener = (EventSelectedListenerHost) activity; - return listener.getEventSelectionListener(); - } - - throw new IllegalStateException(String.format( - "%s cannot be attached to a instance of %s", - EventListFragment.class.getName(), - activity.getClass().getName())); - } + @Override + public void onResume() { + super.onResume(); + loadItems(); + } - @Override - protected String getHeaderText() { - return getString(R.string.label_login_events); - } + @Override + protected ItemSelectedListener attachListener(Activity activity) { + if (activity instanceof EventSelectedListenerHost) { + EventSelectedListenerHost listener = (EventSelectedListenerHost) activity; + return listener.getEventSelectionListener(); + } - @Override - protected void loadItems(ReadonlyDataManager manager) { - manager.loadEvents(this); - } + throw new IllegalStateException(String.format("%s cannot be attached to a instance of %s", + EventListFragment.class.getName(), activity.getClass().getName())); + } + + @Override + protected String getHeaderText() { + return getString(R.string.label_login_events); + } + + @Override + protected void loadItems(ReadonlyDataManager manager) { + manager.loadEvents(this); + } } diff --git a/mobile/com.sap.sailing.racecommittee.glue/project.properties b/mobile/com.sap.sailing.racecommittee.glue/project.properties index f4fc70e6595..484dab07534 100644 --- a/mobile/com.sap.sailing.racecommittee.glue/project.properties +++ b/mobile/com.sap.sailing.racecommittee.glue/project.properties @@ -11,5 +11,5 @@ #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. -target=android-13 +target=android-17 android.library=true From 5927c272a74bc5fe9b58ce83adf61f8a8aae95d8 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Fri, 31 May 2013 17:30:04 +0200 Subject: [PATCH 008/140] # readded up-navigation to RacingActivity --- .../app/ui/activities/LoginActivity.java | 6 +++-- .../app/ui/activities/RacingActivity.java | 23 +++++++++++++------ .../app/ui/activities/SettingsActivity.java | 2 +- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java index 47b1d6fad3a..d6c61c3a17f 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java @@ -38,9 +38,11 @@ public class LoginActivity extends TwoPaneActivity implements EventSelectedListe /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - + // features must be requested before anything else getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS); + + super.onCreate(savedInstanceState); + setContentView(R.layout.login_view); setProgressBarIndeterminateVisibility(false); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java index 20d6f76d29f..ac81cb1813f 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java @@ -29,12 +29,17 @@ import com.sap.sailing.racecommittee.app.ui.fragments.lists.ManagedRaceListFragm import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.RaceInfoListener; public class RacingActivity extends TwoPaneActivity implements RaceInfoListener, CourseDesignListener /* - * implements ResetTimeListener, - * StartModeSelectionListener, - * PathfinderSelectionListener, - * GateLineOpeningTimeSelectionListener, - * CourseDesignSelectionListener - */{ + * implements + * ResetTimeListener + * , + * StartModeSelectionListener + * , + * PathfinderSelectionListener + * , + * GateLineOpeningTimeSelectionListener + * , + * CourseDesignSelectionListener + */{ // private final static String TAG = RacingActivity.class.getName(); private final static String ListFragmentTag = RacingActivity.class.getName() + ".ManagedRaceListFragment"; @@ -59,10 +64,14 @@ public class RacingActivity extends TwoPaneActivity implements RaceInfoListener, @Override public void onCreate(Bundle savedInstanceState) { + // features must be requested before anything else + getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS); + super.onCreate(savedInstanceState); + getActionBar().setDisplayHomeAsUpEnabled(true); + dataManager = DataManager.create(this); - getWindow().requestFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.racing_view); setProgressBarIndeterminateVisibility(false); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/SettingsActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/SettingsActivity.java index 6861bd5554f..dc1e36945c8 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/SettingsActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/SettingsActivity.java @@ -18,7 +18,7 @@ import com.sap.sailing.racecommittee.app.R; * */ public class SettingsActivity extends PreferenceActivity { - + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); From 5a9c6431ce6dd72f207790bae19874ac29560f21 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Fri, 31 May 2013 17:40:19 +0200 Subject: [PATCH 009/140] # renaming --- .../racecommittee/app/ui/activities/RacingActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java index ac81cb1813f..8fba3f2b2a9 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/RacingActivity.java @@ -75,7 +75,7 @@ public class RacingActivity extends TwoPaneActivity implements RaceInfoListener, setContentView(R.layout.racing_view); setProgressBarIndeterminateVisibility(false); - listFragment = getListFragment(); + listFragment = getOrCreateListFragment(); Serializable courseAreaId = getCourseAreaIdFromIntent(); if (courseAreaId == null) { @@ -93,7 +93,7 @@ public class RacingActivity extends TwoPaneActivity implements RaceInfoListener, // StaticVibrator.prepareVibrator(this); } - private ManagedRaceListFragment getListFragment() { + private ManagedRaceListFragment getOrCreateListFragment() { Fragment fragment = getFragmentManager().findFragmentByTag(ListFragmentTag); // on first create add race list fragment if (fragment == null) { From 32c4ee1c6be58499168979082a12972c22074ba8 Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Fri, 31 May 2013 18:03:08 +0200 Subject: [PATCH 010/140] # small refactoring + formatting for clarity --- .../app/services/RaceStateListener.java | 1 - .../ui/adapters/racelist/RaceListAdapter.java | 5 ++- .../app/ui/fragments/RaceInfoFragment.java | 31 ++++++++++--------- .../lists/ManagedRaceListFragment.java | 27 ++++++++-------- 4 files changed, 31 insertions(+), 33 deletions(-) diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateListener.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateListener.java index 4155bfb239b..96fda78d38c 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateListener.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateListener.java @@ -34,6 +34,5 @@ public class RaceStateListener implements RaceStateChangedListener { @Override public void onStartProcedureSpecificEvent(TimePoint eventTime, Integer eventId) { service.handleStartProcedureSpecificEvent(race, eventTime, eventId); - } } \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListAdapter.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListAdapter.java index 88e79cc92cd..8bd9c8b67e0 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListAdapter.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListAdapter.java @@ -40,9 +40,8 @@ public class RaceListAdapter extends ArrayAdapter { private List items; private List originalItems; - public RaceListAdapter(Context context, int textViewResourceId, List objects, - JuryFlagClickedListener juryListener) { - super(context, textViewResourceId, objects); + public RaceListAdapter(Context context, List objects, JuryFlagClickedListener juryListener) { + super(context, 0, objects); this.items = objects; this.originalItems = new ArrayList(); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceInfoFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceInfoFragment.java index 40ae92d8dff..f9898bebd3f 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceInfoFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceInfoFragment.java @@ -131,11 +131,6 @@ public class RaceInfoFragment extends RaceFragment implements RaceStateChangedLi transaction.commit(); } - public void onRaceStateChanged(RaceState state) { - updateCourseDesignLabel(); - switchToInfoFragment(); - } - public void onResetTime() { switchToInfoFragment(SetStartTimeRaceFragment.create(getRace())); } @@ -156,16 +151,6 @@ public class RaceInfoFragment extends RaceFragment implements RaceStateChangedLi updateCourseDesignLabel(); } - @Override - public void onStartTimeChanged(TimePoint startTime) { - //do nothing (onRaceStateChanged(RaceState) handles state change and fragment switch already - } - - @Override - public void onRaceAborted() { - //do nothing (onRaceStateChanged(RaceState) handles state change and fragment switch already - } - private void showRaceResetConfirmationDialog() { prepareResetRaceView(); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); @@ -224,6 +209,22 @@ public class RaceInfoFragment extends RaceFragment implements RaceStateChangedLi //do nothing } + @Override + public void onRaceStateChanged(RaceState state) { + updateCourseDesignLabel(); + switchToInfoFragment(); + } + + @Override + public void onStartTimeChanged(TimePoint startTime) { + //do nothing (onRaceStateChanged(RaceState) handles state change and fragment switch already + } + + @Override + public void onRaceAborted() { + //do nothing (onRaceStateChanged(RaceState) handles state change and fragment switch already + } + @Override public void onStartProcedureSpecificEvent(TimePoint eventTime, Integer eventId) { // TODO Auto-generated method stub diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/ManagedRaceListFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/ManagedRaceListFragment.java index e037a75880d..6748e169d67 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/ManagedRaceListFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/ManagedRaceListFragment.java @@ -55,7 +55,7 @@ public class ManagedRaceListFragment extends ListFragment implements JuryFlagCli // pass the localized string to the data elements... RaceListDataTypeElement.initializeTemplates(this); - adapter = new RaceListAdapter(getActivity(), R.layout.welter_two_row_no_image, raceDataTypeList, this); + adapter = new RaceListAdapter(getActivity(), raceDataTypeList, this); getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); setListAdapter(adapter); } @@ -63,35 +63,35 @@ public class ManagedRaceListFragment extends ListFragment implements JuryFlagCli @Override public void onStart() { super.onStart(); - unregisterAllRaces(); - registerAllRaces(); + unregisterOnAllRaces(); + registerOnAllRaces(); } @Override public void onStop() { - unregisterAllRaces(); + unregisterOnAllRaces(); super.onStop(); } - private void registerAllRaces() { + private void registerOnAllRaces() { for (ManagedRace managedRace : managedRacesById.values()) { managedRace.getState().registerListener(this); } } - private void unregisterAllRaces() { + private void unregisterOnAllRaces() { for (ManagedRace managedRace : managedRacesById.values()) { managedRace.getState().unregisterListener(this); } } public void setupOn(Collection listOfManagedRaces) { - unregisterAllRaces(); + unregisterOnAllRaces(); managedRacesById.clear(); for (ManagedRace managedRace : listOfManagedRaces) { managedRacesById.put(managedRace.getId(), managedRace); } - registerAllRaces(); + registerOnAllRaces(); // initialize view initListElements(false); @@ -100,11 +100,6 @@ public class ManagedRaceListFragment extends ListFragment implements JuryFlagCli notifyDataChanged(); } - @Override - public void onRaceStateChanged(RaceState state) { - notifyDataChanged(); - } - private BoatClass getBoatClassForRace(ManagedRace managedRace) { if (managedRace.getRaceGroup().getBoatClass() == null) { return new BoatClassImpl(managedRace.getRaceGroup().getName(), false); @@ -219,6 +214,11 @@ public class ManagedRaceListFragment extends ListFragment implements JuryFlagCli } } + @Override + public void onRaceStateChanged(RaceState state) { + notifyDataChanged(); + } + @Override public void onStartTimeChanged(TimePoint startTime) { notifyDataChanged(); @@ -232,7 +232,6 @@ public class ManagedRaceListFragment extends ListFragment implements JuryFlagCli @Override public void onStartProcedureSpecificEvent(TimePoint eventTime, Integer eventId) { // TODO Auto-generated method stub - } /* From 17ceb0a28169be511adc4cd87c67d0b7ee70e5ac Mon Sep 17 00:00:00 2001 From: Lukas Niemeier Date: Fri, 31 May 2013 20:47:05 +0200 Subject: [PATCH 011/140] # added selection indicator --- .../drawable-mdpi/list_activated_holo.9.png | Bin 0 -> 883 bytes .../res/drawable/list_selector.xml | 8 +- .../res/layout/login_view.xml | 8 +- .../res/layout/named_list_fragment.xml | 21 + .../res/layout/race_info_view.xml | 58 +-- .../res/layout/racing_view.xml | 7 +- .../res/layout/welter_one_row_no_image.xml | 23 +- .../res/layout/welter_two_row_no_image.xml | 6 +- .../app/ui/activities/TwoPaneActivity.java | 42 +- ...apter.java => ManagedRaceListAdapter.java} | 468 +++++++++--------- .../ui/fragments/lists/EventListFragment.java | 3 +- .../lists/ManagedRaceListFragment.java | 16 +- .../ui/fragments/lists/NamedListFragment.java | 5 + 13 files changed, 344 insertions(+), 321 deletions(-) create mode 100644 mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/list_activated_holo.9.png create mode 100644 mobile/com.sap.sailing.racecommittee.app/res/layout/named_list_fragment.xml rename mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/{RaceListAdapter.java => ManagedRaceListAdapter.java} (95%) diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/list_activated_holo.9.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/list_activated_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f05602f78905de7529e14987a33d9a03eb909cb7 GIT binary patch literal 883 zcmV-(1C0EMP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGfhyVZ!hymq}DM1;MAa*k@H7+qQF!XYv0008wNklYuW6s2Wm-kACm+~`6R zH~tQ{?sTO)UAZvPG)-zW(gH2DAYVh$Xd43BE*fK{1r!Qc#1>}W14Y83zv&Jes0!*Rx{RUuZbiEt!1 zD7K}d*rqBgA5=M7QRPTklfxSt3YIh}P{7h`4vRByurQq_PVXuicE2V=w}ZQX{yZn3 zwvi2ew~G-sAO|l-Y=L}PEKIEtrzb^*CtuklhR1KQXapL4wte$Oevh&0*0Dr^K-z*Q zRd?Qh-n`^VerdNmY1z%qlgj%^QIq_6EX`zzIJHWIN6U?oyUIrj!X5~cRq|zs=w2bt zJIam@!VW0(PD6o$24N!-h(LgQxgO8_U<(w65)>+FNDteCrRGIfymK#%fi^TbSj32i z&An1TZMYY9K#}*V3}KT4>lo3yxi`0al*!4(5QXX;DXWx?><2dEiS4WN>F;cT6tD?u z5n;-vfYId3#(7ub^Kl@9tB!gR^&#*e*_W=5j2<7d!9xdZP=^hOAdtssY+=V=tpEBK z8|#detr`M0sLKXDTxwof}haIpzGAN4T43lnx2A05PcSoyVu3}Y+TCq6FCi9T9Vr?tJ^ z>R9^G26EA+29nzP-z{ - - - - + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_view.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_view.xml index 365ffad30f5..ec9d8241f01 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_view.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_view.xml @@ -11,9 +11,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:layout_weight="0.5" - android:background="@color/welter_extralight_gray_transparent" - > + android:layout_weight="0.5"> + android:layout_weight="0.5"> + + + + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/race_info_view.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_info_view.xml index 726c7ac94e6..82b039a227d 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/layout/race_info_view.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_info_view.xml @@ -2,16 +2,18 @@ - - - + android:orientation="horizontal" > + + + + - + - -