diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/TracTracConnectionConstants.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/TracTracConnectionConstants.java index 14eb07dae71..cdfcc8187b0 100644 --- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/TracTracConnectionConstants.java +++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/TracTracConnectionConstants.java @@ -7,7 +7,7 @@ public interface TracTracConnectionConstants { final int PORT_TUNNEL_LIVE = 1520; //For official usage use 4412; final int PORT_TUNNEL_STORED = PORT_TUNNEL_LIVE + 1; //For official usage use 4413; - final int PORT_LIVE = 4400; //For official usage use 4400; for SAP-dedicated server use 1520 + final int PORT_LIVE = 1520; //For official usage use 4400; for SAP-dedicated server use 1520 final int PORT_STORED = PORT_LIVE + 1; //For official usage use 4401; /* diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractRegattaWithSeriesAndFleetsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractRegattaWithSeriesAndFleetsDialog.java index 07a068228fc..d045599d0d6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractRegattaWithSeriesAndFleetsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractRegattaWithSeriesAndFleetsDialog.java @@ -51,7 +51,7 @@ public abstract class AbstractRegattaWithSeriesAndFleetsDialog extends DataEn protected final ListBox courseAreaListBox; protected final ListBox sailingEventsListBox; protected final CheckBox useStartTimeInferenceCheckBox; - private final ListEditorComposite seriesEditor; + protected final ListEditorComposite seriesEditor; private final ListBox rankingMetricListBox; protected final List existingEvents; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CreateDefaultLeaderboardGroupDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CreateDefaultLeaderboardGroupDialog.java new file mode 100644 index 00000000000..8dbc484a9a0 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CreateDefaultLeaderboardGroupDialog.java @@ -0,0 +1,19 @@ +package com.sap.sailing.gwt.ui.adminconsole; + +import com.sap.sailing.gwt.ui.client.SailingServiceAsync; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sse.gwt.client.ErrorReporter; +import com.sap.sse.gwt.client.dialog.DataEntryDialog; + +public class CreateDefaultLeaderboardGroupDialog extends DataEntryDialog { + public CreateDefaultLeaderboardGroupDialog(SailingServiceAsync sailingService, StringMessages stringMessages, + ErrorReporter errorReporter, DialogCallback dialogCallBack) { + super(stringMessages.createDefaultLeaderboardGroup(), /* message */ stringMessages.createDefaultLeaderboardGroup(), + stringMessages.yes(), stringMessages.no(), /* validator */ null, dialogCallBack); + } + + @Override + protected Void getResult() { + return null; + } +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CreateDefaultRegattaLeaderboardDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CreateDefaultRegattaLeaderboardDialog.java index adc27848469..3a2db03de01 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CreateDefaultRegattaLeaderboardDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CreateDefaultRegattaLeaderboardDialog.java @@ -8,7 +8,7 @@ import com.sap.sailing.gwt.ui.shared.RegattaDTO; import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.dialog.DataEntryDialog; -public class CreateDefaultRegattaLeaderboardDialog extends DataEntryDialog{ +public class CreateDefaultRegattaLeaderboardDialog extends DataEntryDialog { private RegattaDTO regatta; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventCreateDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventCreateDialog.java index 780a27a9f81..66833ca584b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventCreateDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventCreateDialog.java @@ -39,5 +39,7 @@ public class EventCreateDialog extends EventDialog { isPublicCheckBox.setValue(false); imagesListComposite.fillImages(Collections.emptyList()); videosListComposite.fillVideos(Collections.emptyList()); + // add default course area + courseAreaNameList.setValue(Collections.singletonList("Default")); } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java index 5c548c58620..fedf21d03f1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java @@ -9,6 +9,8 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import com.google.gwt.core.client.Scheduler; +import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; @@ -230,7 +232,6 @@ public abstract class EventDialog extends DataEntryDialogWithBootstrap @Override public void show() { super.show(); - nameEntryField.setFocus(true); + Scheduler.get().scheduleFinally(new ScheduledCommand() { @Override public void execute() { nameEntryField.setFocus(true); }}); } - } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java index 70012a52657..1122203b6fd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventListComposite.java @@ -32,6 +32,7 @@ import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.view.client.ListDataProvider; import com.google.gwt.view.client.SelectionChangeEvent; +import com.sap.sailing.gwt.ui.adminconsole.LeaderboardGroupDialog.LeaderboardGroupDescriptor; import com.sap.sailing.gwt.ui.client.EntryPointLinkFactory; import com.sap.sailing.gwt.ui.client.EventsRefresher; import com.sap.sailing.gwt.ui.client.LeaderboardGroupsDisplayer; @@ -41,6 +42,7 @@ import com.sap.sailing.gwt.ui.client.shared.controls.FlushableCellTable; import com.sap.sailing.gwt.ui.client.shared.controls.SelectionCheckboxColumn; import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil; import com.sap.sailing.gwt.ui.shared.CourseAreaDTO; +import com.sap.sailing.gwt.ui.shared.EventBaseDTO; import com.sap.sailing.gwt.ui.shared.EventDTO; import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sailing.gwt.ui.shared.RegattaDTO; @@ -48,6 +50,7 @@ import com.sap.sse.common.Util; import com.sap.sse.common.Util.Pair; import com.sap.sse.common.util.NaturalComparator; import com.sap.sse.gwt.client.ErrorReporter; +import com.sap.sse.gwt.client.async.MarkedAsyncCallback; import com.sap.sse.gwt.client.celltable.EntityIdentityComparator; import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; @@ -433,7 +436,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le private void openCreateEventDialog() { List existingEvents = new ArrayList(eventListDataProvider.getList()); - List existingLeaderboardGroups = new ArrayList(); + final List existingLeaderboardGroups = new ArrayList(); Util.addAll(availableLeaderboardGroups, existingLeaderboardGroups); EventCreateDialog dialog = new EventCreateDialog(Collections.unmodifiableCollection(existingEvents), existingLeaderboardGroups, sailingService, stringMessages, new DialogCallback() { @@ -442,12 +445,57 @@ public class EventListComposite extends Composite implements EventsRefresher, Le } @Override - public void ok(EventDTO newEvent) { - createNewEvent(newEvent); + public void ok(final EventDTO newEvent) { + createNewEvent(newEvent, existingLeaderboardGroups); } }); dialog.show(); } + + /** + * @param newEvent the new event as created by the server, already including a valid {@link EventBaseDTO#id} value. + */ + private void openLeaderboardGroupCreationDialog(final List existingLeaderboardGroups, final EventDTO newEvent) { + LeaderboardGroupCreateDialog leaderboardGroupCreateDialog = new LeaderboardGroupCreateDialog(existingLeaderboardGroups, stringMessages, new DialogCallback() { + @Override + public void ok(final LeaderboardGroupDescriptor newGroup) { + sailingService.createLeaderboardGroup(newGroup.getName(), newGroup.getDescription(), + newGroup.getDisplayName(), newGroup.isDisplayLeaderboardsInReverseOrder(), + newGroup.getOverallLeaderboardDiscardThresholds(), newGroup.getOverallLeaderboardScoringSchemeType(), new MarkedAsyncCallback( + new AsyncCallback() { + @Override + public void onFailure(Throwable t) { + errorReporter.reportError("Error trying to create new leaderboard group" + newGroup.getName() + + ": " + t.getMessage()); + } + @Override + public void onSuccess(LeaderboardGroupDTO newGroup) { + newEvent.addLeaderboardGroup(newGroup); + // fillEvents() will have replaced newEvent in allEvents by a new copy coming from the server which + // doesn't know about the new leaderboard group yet. An updateEvent call will link the leaderboard group + // to the event on the server + EventDTO matchingEvent = null; + for (EventDTO event : allEvents) { + if (event.id.equals(newEvent.id)) { + matchingEvent = event; + } + } + if (matchingEvent != null) { + updateEvent(matchingEvent, newEvent); + } else { + errorReporter.reportError("Could not find the event with name "+newEvent.getName()+" to which the leaderboardgroup should be added"); + } + } + })); + } + + @Override + public void cancel() { + } + }); + leaderboardGroupCreateDialog.setFieldsBasedOnEventName(newEvent.getName()); + leaderboardGroupCreateDialog.show(); + } private void openEditEventDialog(final EventDTO selectedEvent) { List existingEvents = new ArrayList(eventListDataProvider.getList()); @@ -548,7 +596,7 @@ public class EventListComposite extends Composite implements EventsRefresher, Le return new Pair, List>(courseAreasToAdd, courseAreasToRemove); } - private void createNewEvent(final EventDTO newEvent) { + private void createNewEvent(final EventDTO newEvent, final List existingLeaderboardGroups) { List courseAreaNames = new ArrayList(); for (CourseAreaDTO courseAreaDTO : newEvent.venue.getCourseAreas()) { courseAreaNames.add(courseAreaDTO.getName()); @@ -562,8 +610,21 @@ public class EventListComposite extends Composite implements EventsRefresher, Le } @Override - public void onSuccess(EventDTO newEvent) { + public void onSuccess(final EventDTO newEvent) { fillEvents(); + if (newEvent.getLeaderboardGroups().isEmpty()) { + // show simple Dialog + new CreateDefaultLeaderboardGroupDialog(sailingService, stringMessages, errorReporter, new DialogCallback() { + @Override + public void ok(Void editedObject) { + openLeaderboardGroupCreationDialog(existingLeaderboardGroups, newEvent); + } + + @Override + public void cancel() { + } + }).show(); + } } }); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupCreateDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupCreateDialog.java index e013b6fd83c..01b1d69bffb 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupCreateDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupCreateDialog.java @@ -23,4 +23,10 @@ public class LeaderboardGroupCreateDialog extends LeaderboardGroupDialog { displayLeaderboardsInReverseOrderCheckBox.setValue(false); useOverallLeaderboardCheckBox.setValue(false); } + + public void setFieldsBasedOnEventName(String name) { + nameEntryField.setText(name); + descriptionEntryField.setText(name); + validate(); + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LinkRegattaLeaderboardToLeaderboardGroupOfEventDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LinkRegattaLeaderboardToLeaderboardGroupOfEventDialog.java new file mode 100644 index 00000000000..b0dc24b8532 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LinkRegattaLeaderboardToLeaderboardGroupOfEventDialog.java @@ -0,0 +1,61 @@ +package com.sap.sailing.gwt.ui.adminconsole; + +import java.util.ArrayList; +import java.util.List; + +import com.google.gwt.user.client.ui.ListBox; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.ui.client.SailingServiceAsync; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.EventDTO; +import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; +import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; +import com.sap.sse.gwt.client.ErrorReporter; +import com.sap.sse.gwt.client.dialog.DataEntryDialog; + +public class LinkRegattaLeaderboardToLeaderboardGroupOfEventDialog extends DataEntryDialog { + private final List leaderboardGroups; + private ListBox leaderboardGroupsBox; + + public LinkRegattaLeaderboardToLeaderboardGroupOfEventDialog(SailingServiceAsync sailingService, final StringMessages stringMessages, + ErrorReporter errorReporter, StrippedLeaderboardDTO leaderboard, EventDTO event, DialogCallback callback) { + super(stringMessages.linkLeaderboardToLeaderboardGroupOfEvent(), + /*message*/ stringMessages.doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent(leaderboard.name, event.getName()), + stringMessages.yes(), stringMessages.no(), + /*validator*/ new Validator() { + @Override + public String getErrorMessage(LeaderboardGroupDTO selectedLeaderboardGroup) { + final String errorMessage; + if (selectedLeaderboardGroup == null) { + errorMessage = stringMessages.pleaseSelectALeaderboardGroup(); + } else { + errorMessage = null; + } + return errorMessage; + } + }, callback); + this.leaderboardGroups = new ArrayList<>(); + leaderboardGroupsBox = createListBox(/* isMultipleSelect */ false); + for (final LeaderboardGroupDTO lgDTO : event.getLeaderboardGroups()) { + this.leaderboardGroups.add(lgDTO); + this.leaderboardGroupsBox.addItem(lgDTO.getName()); + } + } + + @Override + protected Widget getAdditionalWidget() { + return leaderboardGroupsBox; + } + + @Override + protected LeaderboardGroupDTO getResult() { + final LeaderboardGroupDTO result; + if (leaderboardGroupsBox.getSelectedItemText() == null) { + result = null; + } else { + result = leaderboardGroups.get(leaderboardGroupsBox.getSelectedIndex()); + } + return result; + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java index a8d35952281..c643f169822 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaManagementPanel.java @@ -6,6 +6,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; +import java.util.UUID; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; @@ -25,11 +26,14 @@ import com.sap.sailing.gwt.ui.client.RegattaRefresher; import com.sap.sailing.gwt.ui.client.RegattasDisplayer; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.CourseAreaDTO; import com.sap.sailing.gwt.ui.shared.EventDTO; +import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; import com.sap.sailing.gwt.ui.shared.RegattaDTO; import com.sap.sailing.gwt.ui.shared.SeriesDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; import com.sap.sse.gwt.client.ErrorReporter; +import com.sap.sse.gwt.client.async.MarkedAsyncCallback; import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel; import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback; @@ -154,7 +158,6 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl private void openCreateRegattaDialog() { final Collection existingRegattas = Collections.unmodifiableCollection(regattaListComposite.getAllRegattas()); - sailingService.getEvents(new AsyncCallback>() { @Override public void onFailure(Throwable caught) { @@ -168,7 +171,7 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl }); } - private void openCreateRegattaDialog(Collection existingRegattas, List existingEvents) { + private void openCreateRegattaDialog(Collection existingRegattas, final List existingEvents) { RegattaWithSeriesAndFleetsCreateDialog dialog = new RegattaWithSeriesAndFleetsCreateDialog(existingRegattas, existingEvents, stringMessages, new DialogCallback() { @Override @@ -177,15 +180,14 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl @Override public void ok(RegattaDTO newRegatta) { - createNewRegatta(newRegatta); - openCreateDefaultRegattaLeaderboardDialog(newRegatta); + createNewRegatta(newRegatta, existingEvents); } }); dialog.ensureDebugId("RegattaCreateDialog"); dialog.show(); } - private void openCreateDefaultRegattaLeaderboardDialog(final RegattaDTO newRegatta){ + private void openCreateDefaultRegattaLeaderboardDialog(final RegattaDTO newRegatta, final List existingEvents) { CreateDefaultRegattaLeaderboardDialog dialog = new CreateDefaultRegattaLeaderboardDialog(sailingService, stringMessages, errorReporter, newRegatta, new DialogCallback() { @Override public void ok(RegattaIdentifier regattaIdentifier) { @@ -199,7 +201,15 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl @Override public void onSuccess(StrippedLeaderboardDTO result) { + if (newRegatta.defaultCourseAreaUuid != null) { + // Show the event's leaderboard groups and allow the user to pick one to assign the regatta leaderboard to + final EventDTO event = getEventForCourseArea(existingEvents, newRegatta.defaultCourseAreaUuid); + if (!event.getLeaderboardGroups().isEmpty()) { + openRegattaLeaderboardToLeaderboardGroupOfEventLinkingDialog(result, event); + } + } } + }); } @@ -207,12 +217,66 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl public void cancel() { } }); - dialog.ensureDebugId("CreateDefaultRegattaDialog"); dialog.show(); } - private void createNewRegatta(final RegattaDTO newRegatta) { + /** + * When a new regatta with a new regatta leaderboard has been created, the user will now be given the chance to link + * the regatta leaderboard into a leaderboard group of the event out of which the regatta chose its default course area. + * + * @param newRegattaLeaderboard the new regatta leaderboard that the user may link now to a leaderboard group of an event + * @param eventToLinkRegattaTo an event that has at least one {@link EventDTO#getLeaderboardGroups() leaderboard group} + */ + private void openRegattaLeaderboardToLeaderboardGroupOfEventLinkingDialog(final StrippedLeaderboardDTO newRegattaLeaderboard, EventDTO eventToLinkRegattaTo) { + LinkRegattaLeaderboardToLeaderboardGroupOfEventDialog dialog = new LinkRegattaLeaderboardToLeaderboardGroupOfEventDialog(sailingService, stringMessages, errorReporter, newRegattaLeaderboard, eventToLinkRegattaTo, + new DialogCallback() { + @Override + public void ok(final LeaderboardGroupDTO selectedLeaderboardGroup) { + final List leaderboardNames = new ArrayList<>(); + for (StrippedLeaderboardDTO leaderboard : selectedLeaderboardGroup.getLeaderboards()) { + leaderboardNames.add(leaderboard.name); + } + leaderboardNames.add(newRegattaLeaderboard.name); + sailingService.updateLeaderboardGroup(selectedLeaderboardGroup.getName(), selectedLeaderboardGroup.getName(), selectedLeaderboardGroup.description, + selectedLeaderboardGroup.getDisplayName(), leaderboardNames, selectedLeaderboardGroup.getOverallLeaderboardDiscardThresholds(), + selectedLeaderboardGroup.getOverallLeaderboardScoringSchemeType(), new MarkedAsyncCallback(new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError(stringMessages.failedToLinkLeaderboardToLeaderboardGroup(newRegattaLeaderboard.name, selectedLeaderboardGroup.getName())); + } + + @Override + public void onSuccess(Void result) { + } + })); + } + + @Override + public void cancel() { + } + }); + dialog.ensureDebugId("LinkRegattaLeaderboardToLeaderboardGroupOfEventDialog"); + dialog.show(); + } + + private EventDTO getEventForCourseArea(final List existingEvents, final UUID courseAreaId) { + EventDTO result = null; + eventLoop: + for (final EventDTO event : existingEvents) { + if (event.venue != null) { + for (CourseAreaDTO courseArea : event.venue.getCourseAreas()) { + if (courseArea.id.equals(courseAreaId)) { + result = event; + break eventLoop; + } + } + } + } + return result; + } + + private void createNewRegatta(final RegattaDTO newRegatta, final List existingEvents) { LinkedHashMap seriesStructure = new LinkedHashMap(); for (SeriesDTO seriesDTO : newRegatta.series) { SeriesCreationParametersDTO seriesPair = new SeriesCreationParametersDTO(seriesDTO.getFleets(), @@ -234,6 +298,7 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl @Override public void onSuccess(RegattaDTO regatta) { regattaRefresher.fillRegattas(); + openCreateDefaultRegattaLeaderboardDialog(regatta, existingEvents); } }); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaWithSeriesAndFleetsCreateDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaWithSeriesAndFleetsCreateDialog.java index 13f273b65ea..42def8f4926 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaWithSeriesAndFleetsCreateDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaWithSeriesAndFleetsCreateDialog.java @@ -11,6 +11,8 @@ import com.google.gwt.core.shared.GWT; import com.google.gwt.user.client.ui.Grid; import com.google.gwt.user.client.ui.TabPanel; import com.google.gwt.user.client.ui.VerticalPanel; +import com.sap.sailing.domain.common.LeaderboardNameConstants; +import com.sap.sailing.domain.common.dto.FleetDTO; import com.sap.sailing.gwt.ui.client.StringMessages; import com.sap.sailing.gwt.ui.shared.EventDTO; import com.sap.sailing.gwt.ui.shared.RegattaDTO; @@ -103,6 +105,14 @@ public class RegattaWithSeriesAndFleetsCreateDialog extends RegattaWithSeriesAnd List existingEvents, StringMessages stringMessages, DialogCallback callback) { super(new RegattaDTO(), Collections.emptySet(), existingEvents, stringMessages.addRegatta(), stringMessages.ok(), stringMessages, new RegattaParameterValidator(stringMessages, existingRegattas), callback); + SeriesDTO series = new SeriesDTO(); + series.setName("Default"); + series.setMedal(false); + series.setStartsWithZeroScore(false); + series.setSplitFleetContiguousScoring(false); + series.setFirstColumnIsNonDiscardableCarryForward(false); + series.setFleets(Collections.singletonList(new FleetDTO(LeaderboardNameConstants.DEFAULT_FLEET_NAME, 0, null))); + seriesEditor.setValue(Collections.singleton(series)); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index 545fbd5a26b..ae4f96bbecd 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -1469,6 +1469,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String confirmLosingCompetitorEditsWhenTogglingLogBasedView(); String removalOfMarkDisabledMayBeUsedInRaces(String raceNames); String pleaseCreateAtLeastOneMappingBy(); + String createDefaultLeaderboardGroup(); String matcherType(); String matchingDevices(); String addDevice(); @@ -1477,4 +1478,8 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c String create(); String thereIsAlreadyAConfigurationForThisDevice(); String enterDeviceIdentifierName(); + String pleaseSelectALeaderboardGroup(); + String linkLeaderboardToLeaderboardGroupOfEvent(); + String doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent(String leaderboardName, String eventName); + String failedToLinkLeaderboardToLeaderboardGroup(String leaderboardName, String leaderboardGroupName); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 0719782a710..23c89940828 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -1435,6 +1435,8 @@ profile=Profile showOnlyCompetitorsOfLog=Show only competitors registered in Log confirmLosingCompetitorEditsWhenTogglingLogBasedView=This will reset your current, unsaved changes to the competitors.\nDo you really want to continue? removalOfMarkDisabledMayBeUsedInRaces=Removal deavticated, marks are used in races {0} +pleaseCreateAtLeastOneMappingBy=Plase create at list one mapping by first selecting a track on the left hand side and then selecting a mark or competitor on the right hand side +createDefaultLeaderboardGroup=Would you like to create a default LeaderboardGroup for your event? pleaseCreateAtLeastOneMappingBy=Please create at least one mapping by first selecting a track on the left hand side and then selecting a mark or competitor on the right hand side matcherType=Matcher type matchingDevices=Matching devices @@ -1443,4 +1445,8 @@ createDeviceConfiguration=Create Device Configuration forWhichDeviceShouldConfigurationApply=Specify for which device the new configuration should apply create=Create thereIsAlreadyAConfigurationForThisDevice=There is already a configuration for this device. -enterDeviceIdentifierName=Enter an identifier name \ No newline at end of file +enterDeviceIdentifierName=Enter an identifier name +pleaseSelectALeaderboardGroup=Please select a leaderboard group +linkLeaderboardToLeaderboardGroupOfEvent=Link Leaderboard to Leaderboard Group of Event +doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent=Link leaderboard {0} to a leaderboard group of event {1} +failedToLinkLeaderboardToLeaderboardGroup=Failed to link leaderboard {0} to leaderboard group {1} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index 536f73dc052..4dbb9fc78b3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -1427,6 +1427,7 @@ scoringSchemeHighPointFirstGetsTwelveOrEightDescription=Scores als Punkte. Der G scoringSchemeHighPointEssOverall12=High Point System ESS Gesamtwertung (12) scoringSchemeHighPointEssOverall12Description=High Point System, der Gewinner eines Acts erhält 12 Punkte, der Zweite 11 und so weiter. pleaseCreateAtLeastOneMappingBy=Bitte erstellen Sie mindestens eine Zuordnung, indem Sie zunächst einen Track auf der linken Seite und anschließend einen Teilnehmer oder eine Tonne auf der rechten Seite auswählen +createDefaultLeaderboardGroup=Möchten Sie eine Default-Ranglisten-Gruppe für ihr Event anlegen? matcherType=Matcher-Typ matchingDevices=Passende Geräte addDevice=Gerät hinzufügen @@ -1434,4 +1435,8 @@ createDeviceConfiguration=Gerätekonfiguration anlegen forWhichDeviceShouldConfigurationApply=Für welches Gerät soll die neue Konfiguration gelten? create=Anlegen thereIsAlreadyAConfigurationForThisDevice=Es gibt bereits eine Konfiguration für dieses Gerät. -enterDeviceIdentifierName=Geräteidentifikator eingeben \ No newline at end of file +enterDeviceIdentifierName=Geräteidentifikator eingeben +pleaseSelectALeaderboardGroup=Bitte eine Ranglisten-Gruppe auswählen +linkLeaderboardToLeaderboardGroupOfEvent=Ergebnisliste einer Ranglisten-Gruppe einer Veranstaltung hinzufügen +doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent=Ergebnisliste {0} zu einer Ranglisten-Gruppe der Veranstaltung {1} hinzufügen +failedToLinkLeaderboardToLeaderboardGroup=Ergebnisliste {0} konnte nicht in Ranglisten-Gruppe {1} eingefügt werden \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index 4683ea3f657..95246194481 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1357,6 +1357,8 @@ scoringSchemeHighPointFirstGetsTwelveOrEight=High Point, winner gets 12 points ( scoringSchemeHighPointFirstGetsTwelveOrEightDescription=Score in points. Winner scores 12 points, 2nd - 11 points, .... A tie is broken in favour of the competitor having won most races, if tie remains then tie is broken by the rank in the last race scored. scoringSchemeHighPointEssOverall12=High Point System ESS Overall (12) scoringSchemeHighPointEssOverall12Description=Score in points. Winner of an act scores 12 points, 2nd - 11 points, .... Any tie in the overall Extreme Sailing Series is broken in favour of the competitor with the most Act wins. If that does not break the tie, the result in the last Act will be used. +pleaseCreateAtLeastOneMappingBy=Plase create at list one mapping by first selecting a track on the left hand side and then selecting a mark or competitor on the right hand side +createDefaultLeaderboardGroup=Would you like to create a default LeaderboardGroup for your event? pleaseCreateAtLeastOneMappingBy=Please create at least one mapping by first selecting a track on the left hand side and then selecting a mark or competitor on the right hand side matcherType=Matcher type matchingDevices=Matching devices @@ -1365,4 +1367,8 @@ createDeviceConfiguration=Create Device Configuration forWhichDeviceShouldConfigurationApply=Specify for which device the new configuration should apply create=Create thereIsAlreadyAConfigurationForThisDevice=There is already a configuration for this device. -enterDeviceIdentifierName=Enter an identifier name \ No newline at end of file +enterDeviceIdentifierName=Enter an identifier name +pleaseSelectALeaderboardGroup=Please select a leaderboard group +linkLeaderboardToLeaderboardGroupOfEvent=Link Leaderboard to Leaderboard Group of Event +doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent=Link leaderboard {0} to a leaderboard group of event {1} +failedToLinkLeaderboardToLeaderboardGroup=Failed to link leaderboard {0} to leaderboard group {1} \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index 4f5bebfd9c1..3c352a49545 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -1372,6 +1372,8 @@ scoringSchemeHighPointFirstGetsTwelveOrEight=High Point, winner gets 12 points ( scoringSchemeHighPointFirstGetsTwelveOrEightDescription=Score in points. Winner scores 12 points, 2nd - 11 points, .... A tie is broken in favour of the competitor having won most races, if tie remains then tie is broken by the rank in the last race scored. scoringSchemeHighPointEssOverall12=High Point System ESS Overall (12) scoringSchemeHighPointEssOverall12Description=Score in points. Winner of an act scores 12 points, 2nd - 11 points, .... Any tie in the overall Extreme Sailing Series is broken in favour of the competitor with the most Act wins. If that does not break the tie, the result in the last Act will be used. +pleaseCreateAtLeastOneMappingBy=Plase create at list one mapping by first selecting a track on the left hand side and then selecting a mark or competitor on the right hand side +createDefaultLeaderboardGroup=Would you like to create a default LeaderboardGroup for your event? pleaseCreateAtLeastOneMappingBy=Please create at least one mapping by first selecting a track on the left hand side and then selecting a mark or competitor on the right hand side matcherType=Matcher type matchingDevices=Matching devices @@ -1380,4 +1382,8 @@ createDeviceConfiguration=Create Device Configuration forWhichDeviceShouldConfigurationApply=Specify for which device the new configuration should apply create=Create thereIsAlreadyAConfigurationForThisDevice=There is already a configuration for this device. -enterDeviceIdentifierName=Enter an identifier name \ No newline at end of file +enterDeviceIdentifierName=Enter an identifier name +pleaseSelectALeaderboardGroup=Please select a leaderboard group +linkLeaderboardToLeaderboardGroupOfEvent=Link Leaderboard to Leaderboard Group of Event +doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent=Link leaderboard {0} to a leaderboard group of event {1} +failedToLinkLeaderboardToLeaderboardGroup=Failed to link leaderboard {0} to leaderboard group {1} \ No newline at end of file diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/regatta/RegattaStructureManagementPanelPO.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/regatta/RegattaStructureManagementPanelPO.java index 774ba59ebfa..8027a05948c 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/regatta/RegattaStructureManagementPanelPO.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/regatta/RegattaStructureManagementPanelPO.java @@ -9,7 +9,7 @@ import com.sap.sailing.selenium.pages.PageArea; import com.sap.sailing.selenium.pages.adminconsole.regatta.RegattaListCompositePO.RegattaDescriptor; public class RegattaStructureManagementPanelPO extends PageArea { - public static final String DEFAULT_SERIES_NAME = "Default"; //$NON-NLS-1$ + public static final String DEFAULT_SERIES_NAME = "DefaultSelenium"; //$NON-NLS-1$ @FindBy(how = BySeleniumId.class, using = "AddRegattaButton") WebElement addRegattaButton; diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestSmartphoneTrackingEventManagementPanel.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestSmartphoneTrackingEventManagementPanel.java index 316460cbcd5..7b8a8e38f18 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestSmartphoneTrackingEventManagementPanel.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestSmartphoneTrackingEventManagementPanel.java @@ -57,7 +57,7 @@ public class TestSmartphoneTrackingEventManagementPanel extends AbstractSelenium String raceName = String.format(RACE, i); TrackableRaceDescriptor trackableRace = new TrackableRaceDescriptor(EVENT, raceName, BOAT_CLASS); TrackedRaceDescriptor trackedRace = new TrackedRaceDescriptor(this.regatta.toString(), BOAT_CLASS, raceName); - RaceDescriptor leaderboardRace = new RaceDescriptor(String.format("R%s", i), "Default", false, false, 0); + RaceDescriptor leaderboardRace = new RaceDescriptor(String.format("D%s", i), "Default", false, false, 0); this.trackableRaces.add(trackableRace); this.trackedRaces.add(trackedRace); diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestColumnsInLeaderboard.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestColumnsInLeaderboard.java index fe6b53483e2..6258ba90338 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestColumnsInLeaderboard.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestColumnsInLeaderboard.java @@ -50,7 +50,7 @@ public class TestColumnsInLeaderboard extends AbstractSeleniumTest { this.regatta = new RegattaDescriptor(REGATTA, BOAT_CLASS); this.trackableRace = new TrackableRaceDescriptor(EVENT, RACE, BOAT_CLASS); this.trackedRace = new TrackedRaceDescriptor(this.regatta.toString(), BOAT_CLASS, RACE); - this.raceColumn = new RaceDescriptor("R1", "Default", false, false, 0.0); + this.raceColumn = new RaceDescriptor("D1", "Default", false, false, 0.0); clearState(getContextRoot()); super.setUp(); configureLeaderboard(); diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestLeaderboardConfiguration.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestLeaderboardConfiguration.java index e138920caad..32b7500e357 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestLeaderboardConfiguration.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestLeaderboardConfiguration.java @@ -60,7 +60,7 @@ public class TestLeaderboardConfiguration extends AbstractSeleniumTest { String raceName = String.format(RACE, i); TrackableRaceDescriptor trackableRace = new TrackableRaceDescriptor(EVENT, raceName, BOAT_CLASS); TrackedRaceDescriptor trackedRace = new TrackedRaceDescriptor(this.regatta.toString(), BOAT_CLASS, raceName); - RaceDescriptor leaderboardRace = new RaceDescriptor(String.format("R%s", i), "Default", false, false, 0); + RaceDescriptor leaderboardRace = new RaceDescriptor(String.format("D%s", i), "Default", false, false, 0); this.trackableRaces.add(trackableRace); this.trackedRaces.add(trackedRace); @@ -100,12 +100,12 @@ public class TestLeaderboardConfiguration extends AbstractSeleniumTest { leaderboard.refresh(); List allEntries = table.getEntries(); LeaderboardEntry findelJens = table.getEntry("8875"); - Integer points = findelJens.getPointsForRace(String.format("R%s", i + 1)); + Integer points = findelJens.getPointsForRace(String.format("D%s", i + 1)); Integer rank = findelJens.getTotalRank(); // Assertions assertThat("Number of competitors does not match", allEntries.size(), equalTo(28)); - assertThat("Points for race 'R" + (i + 1) + "' do not match for competitor '8875' (Findel, Jens)", + assertThat("Points for race 'D" + (i + 1) + "' do not match for competitor '8875' (Findel, Jens)", points, equalTo(expectedPointsForFindelJens[i])); assertThat("Total rank after " + (i + 1) + " race(s) does not match for competitor '8875' (Findel, Jens)", rank, equalTo(expectedRankForFindelJens[i])); @@ -136,13 +136,13 @@ public class TestLeaderboardConfiguration extends AbstractSeleniumTest { RegattaStructureManagementPanelPO regattaStructure = adminConsole.goToRegattaStructure(); RegattaDetailsCompositePO regattaDetails = regattaStructure.getRegattaDetails(this.regatta); SeriesEditDialogPO seriesDialog = regattaDetails.editSeries(RegattaStructureManagementPanelPO.DEFAULT_SERIES_NAME); - seriesDialog.deleteRace("R3"); + seriesDialog.deleteRace("D3"); seriesDialog.pressOk(true); // Now we can check the result with our expectation leaderboardWindow.switchToWindow(); leaderboard.refresh(); - assertThat("Race names do not match after deletion of race 'R3'", - table.getRaceNames(), equalTo(Arrays.asList("R1", "R2", "R4", "R5"))); + assertThat("Race names do not match after deletion of race 'D3'", + table.getRaceNames(), equalTo(Arrays.asList("D1", "D2", "D4", "D5"))); } @Ignore("This test belongs to bug 1892 and currently fails. It is currently enabled on branch bug1892.") @@ -175,15 +175,15 @@ public class TestLeaderboardConfiguration extends AbstractSeleniumTest { RegattaStructureManagementPanelPO regattaStructure = adminConsole.goToRegattaStructure(); RegattaDetailsCompositePO regattaDetails = regattaStructure.getRegattaDetails(this.regatta); SeriesEditDialogPO seriesDialog = regattaDetails.editSeries(RegattaStructureManagementPanelPO.DEFAULT_SERIES_NAME); - seriesDialog.renameRace("R1", "Q"); + seriesDialog.renameRace("D1", "Q"); seriesDialog.pressOk(true); // Now we can check the result with our expectation leaderboardWindow.switchToWindow(); leaderboard.refresh(); List races = table.getRaceNames(); - assertThat("Race names do not match after renaming race 'R1' to 'Q'", - races, equalTo(Arrays.asList("Q", "R2", "R3", "R4", "R5"))); + assertThat("Race names do not match after renaming race 'D1' to 'Q'", + races, equalTo(Arrays.asList("Q", "D2", "D3", "D4", "D5"))); } private void configureLeaderboard() { diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestSwitchingOffStartOfRaceInference.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestSwitchingOffStartOfRaceInference.java index 64af7f0bb6e..bd03dd17d59 100755 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestSwitchingOffStartOfRaceInference.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestSwitchingOffStartOfRaceInference.java @@ -54,7 +54,7 @@ public class TestSwitchingOffStartOfRaceInference extends AbstractSeleniumTest { this.regatta = new RegattaDescriptor(REGATTA, BOAT_CLASS); this.trackableRace = new TrackableRaceDescriptor(EVENT, RACE, BOAT_CLASS); this.trackedRace = new TrackedRaceDescriptor(this.regatta.toString(), BOAT_CLASS, RACE); - this.raceColumn = new RaceDescriptor("R3", "Default", false, false, 0.0); + this.raceColumn = new RaceDescriptor("D3", "Default", false, false, 0.0); clearState(getContextRoot()); super.setUp(); adminConsole = configureRegattaAndLeaderboard(); @@ -69,10 +69,10 @@ public class TestSwitchingOffStartOfRaceInference extends AbstractSeleniumTest { LeaderboardPage leaderboard = LeaderboardPage.goToPage(getWebDriver(), getContextRoot(), LEADERBOARD, /* race details */ false); LeaderboardTablePO leaderboardTable = leaderboard.getLeaderboardTable(); List races = leaderboardTable.getRaceNames(); - assertThat("Expected only R3", races, equalTo(Arrays.asList("R3"))); - int r3ColumnIndex = leaderboardTable.getColumnIndex("R3"); + assertThat("Expected only D3", races, equalTo(Arrays.asList("D3"))); + int d3ColumnIndex = leaderboardTable.getColumnIndex("D3"); for (LeaderboardEntry e : leaderboardTable.getEntries()) { - String raceColumnContent = e.getColumnContent(r3ColumnIndex); + String raceColumnContent = e.getColumnContent(d3ColumnIndex); assertTrue(Integer.parseInt(raceColumnContent) > 0); // all competitors have a positive score in R3 } adminConsoleWindow.switchToWindow(); @@ -85,7 +85,7 @@ public class TestSwitchingOffStartOfRaceInference extends AbstractSeleniumTest { leaderboardWindow.switchToWindow(); leaderboard.refresh(); for (LeaderboardEntry e : leaderboardTable.getEntries()) { - String raceColumnContent = e.getColumnContent(r3ColumnIndex); + String raceColumnContent = e.getColumnContent(d3ColumnIndex); assertEquals("", raceColumnContent); // all competitors have an empty score because there is no start time anymore } leaderboardWindow.close(); diff --git a/java/com.sap.sailing.www/release_notes_admin.html b/java/com.sap.sailing.www/release_notes_admin.html index b8e3cc9f66f..1ed9c74f8d4 100644 --- a/java/com.sap.sailing.www/release_notes_admin.html +++ b/java/com.sap.sailing.www/release_notes_admin.html @@ -27,6 +27,9 @@

February 2016

    +
  • Several improvements regarding the creation of race metadata (events, regatta, etc.) including: + automatic creation of default series, dialog for creating a default leaderboard group +
  • The RaceBoard URL Parameter "canReplayDuringLiveRaces" has been removed. This parameter was used to allow users to trigger autoplay for live races on non-live points in time. The permission "CAN_REPLAY_DURING_LIVE_RACES" and role "moderator" now grant this functionality to users. diff --git a/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF b/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF index a068143bcb1..d870aa3c9d3 100644 --- a/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF +++ b/java/com.tractrac.clientmodule/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: TracTrac Client module Bundle-SymbolicName: com.tractrac.clientmodule -Bundle-Version: 3.1.4 +Bundle-Version: 3.1.5 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ClassPath: ., lib/TracAPI.jar diff --git a/java/com.tractrac.clientmodule/README.txt b/java/com.tractrac.clientmodule/README.txt index 6fac5371225..bb797ccce30 100644 --- a/java/com.tractrac.clientmodule/README.txt +++ b/java/com.tractrac.clientmodule/README.txt @@ -16,6 +16,18 @@ It contains also some files: - test.sh -> script that compiles the code in the src folder, creates the test.jar library and execute the code of the example. - Manifest.txt -> manifest used to create the test.jar file +******************************************** +************* TracAPI 3.1.5 **************** +******************************************** +This is a final version. Only fixes bugs in the implementation + +Release date: 17/02/2016 +Build number: 11948 + + 1) Bugs + + - The bug of the previous release (3.1.2) was not fixed. + ******************************************** ************* TracAPI 3.1.4 **************** ******************************************** @@ -39,7 +51,7 @@ Build number: 11888 1) Bugs - - The bug of the previous release (3.1.3) was not fixed. + - The bug of the previous release (3.1.2) was not fixed. ******************************************** ************* TracAPI 3.1.2 **************** diff --git a/java/com.tractrac.clientmodule/lib/TracAPI-src.jar b/java/com.tractrac.clientmodule/lib/TracAPI-src.jar index ff4eb35f824..2599699c29f 100755 Binary files a/java/com.tractrac.clientmodule/lib/TracAPI-src.jar and b/java/com.tractrac.clientmodule/lib/TracAPI-src.jar differ diff --git a/java/com.tractrac.clientmodule/lib/TracAPI.jar b/java/com.tractrac.clientmodule/lib/TracAPI.jar index 98eccaf79fc..0b5d8926c2c 100644 Binary files a/java/com.tractrac.clientmodule/lib/TracAPI.jar and b/java/com.tractrac.clientmodule/lib/TracAPI.jar differ diff --git a/java/com.tractrac.clientmodule/pom.xml b/java/com.tractrac.clientmodule/pom.xml index 0a5dfa6dabe..93dc4d12afa 100755 --- a/java/com.tractrac.clientmodule/pom.xml +++ b/java/com.tractrac.clientmodule/pom.xml @@ -8,6 +8,6 @@ 1.0.0-SNAPSHOT com.tractrac.clientmodule - 3.1.4 + 3.1.5 eclipse-plugin diff --git a/mobile/com.sap.sailing.android.shared/res/values/strings_fragment.xml b/mobile/com.sap.sailing.android.shared/res/values/strings_fragment.xml index cd9338ffaca..bdb17bb047e 100644 --- a/mobile/com.sap.sailing.android.shared/res/values/strings_fragment.xml +++ b/mobile/com.sap.sailing.android.shared/res/values/strings_fragment.xml @@ -2,5 +2,5 @@ Scan QR-Code The QR-code can be found on your confirmation of participation - You got no QR-Code? + Don\'t Have a QR Code? diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable-hdpi/ic_action_navigation_refresh.png b/mobile/com.sap.sailing.android.tracking.app/res/drawable-hdpi/ic_action_navigation_refresh.png new file mode 100755 index 00000000000..8e91387dde5 Binary files /dev/null and b/mobile/com.sap.sailing.android.tracking.app/res/drawable-hdpi/ic_action_navigation_refresh.png differ diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable-mdpi/ic_action_navigation_refresh.png b/mobile/com.sap.sailing.android.tracking.app/res/drawable-mdpi/ic_action_navigation_refresh.png new file mode 100755 index 00000000000..a729e9d09c6 Binary files /dev/null and b/mobile/com.sap.sailing.android.tracking.app/res/drawable-mdpi/ic_action_navigation_refresh.png differ diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable-xhdpi/ic_action_navigation_refresh.png b/mobile/com.sap.sailing.android.tracking.app/res/drawable-xhdpi/ic_action_navigation_refresh.png new file mode 100755 index 00000000000..2d94e0d6f56 Binary files /dev/null and b/mobile/com.sap.sailing.android.tracking.app/res/drawable-xhdpi/ic_action_navigation_refresh.png differ diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable-xxhdpi/ic_action_navigation_refresh.png b/mobile/com.sap.sailing.android.tracking.app/res/drawable-xxhdpi/ic_action_navigation_refresh.png new file mode 100755 index 00000000000..31ff5c04f6b Binary files /dev/null and b/mobile/com.sap.sailing.android.tracking.app/res/drawable-xxhdpi/ic_action_navigation_refresh.png differ diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable-xxxhdpi/ic_action_navigation_refresh.png b/mobile/com.sap.sailing.android.tracking.app/res/drawable-xxxhdpi/ic_action_navigation_refresh.png new file mode 100755 index 00000000000..e74c895ef2f Binary files /dev/null and b/mobile/com.sap.sailing.android.tracking.app/res/drawable-xxxhdpi/ic_action_navigation_refresh.png differ diff --git a/mobile/com.sap.sailing.android.tracking.app/res/drawable/working_title.png b/mobile/com.sap.sailing.android.tracking.app/res/drawable/working_title.png index f0ca3537590..7bc1d20bc3c 100644 Binary files a/mobile/com.sap.sailing.android.tracking.app/res/drawable/working_title.png and b/mobile/com.sap.sailing.android.tracking.app/res/drawable/working_title.png differ diff --git a/mobile/com.sap.sailing.android.tracking.app/res/layout-land/fragment_regatta.xml b/mobile/com.sap.sailing.android.tracking.app/res/layout-land/fragment_regatta.xml index b741817f04c..f58342a87aa 100644 --- a/mobile/com.sap.sailing.android.tracking.app/res/layout-land/fragment_regatta.xml +++ b/mobile/com.sap.sailing.android.tracking.app/res/layout-land/fragment_regatta.xml @@ -44,7 +44,8 @@ android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:background="@color/white_transparent" - android:orientation="horizontal"> + android:orientation="horizontal" + tools:visibility="gone"> + + + + + + + + + + + + + + + android:orientation="horizontal" + tools:visibility="gone"> + + + + + + + + + + + + + + Einstellungen Tracking läuft für %s Warte auf GPS-Signal + Wird hochgeladen... + Fehler beim Hochladen: + Hochladen wiederholen \ No newline at end of file diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values/strings.xml b/mobile/com.sap.sailing.android.tracking.app/res/values/strings.xml index c8572258775..b63c2699757 100644 --- a/mobile/com.sap.sailing.android.tracking.app/res/values/strings.xml +++ b/mobile/com.sap.sailing.android.tracking.app/res/values/strings.xml @@ -19,6 +19,9 @@ Please confirm Do you really want to stop tracking? Add Team Photo + Uploading… + Retry upload + Error uploading image: Do you want to use an existing image or take a new one? Existing Take Photo diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values/strings_fragment.xml b/mobile/com.sap.sailing.android.tracking.app/res/values/strings_fragment.xml index a41bf39a8bb..067085222a8 100644 --- a/mobile/com.sap.sailing.android.tracking.app/res/values/strings_fragment.xml +++ b/mobile/com.sap.sailing.android.tracking.app/res/values/strings_fragment.xml @@ -1,21 +1,21 @@ - + Scan QR-Code The QR-code can be found on your confirmation of participation - You got no QR-Code? + Don\'t Have a QR Code? Start tracking Stop tracking GPS Accuracy Mode Live Battery Saving - Unsent fixes + Unsent Fixes Offline API-Error Offline Tracking Time Status - Tracking running + Tracking No GPS Signal! Regatta User Image Add Photo Button diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java index 431321aa9b9..a45d7b47ecd 100755 --- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java @@ -1,15 +1,10 @@ package com.sap.sailing.android.tracking.app.ui.activities; -import java.io.BufferedReader; -import java.io.DataOutputStream; import java.io.File; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.Locale; @@ -51,6 +46,9 @@ import com.sap.sailing.android.shared.util.UniqueDeviceUuid; import com.sap.sailing.android.tracking.app.BuildConfig; import com.sap.sailing.android.tracking.app.R; import com.sap.sailing.android.tracking.app.ui.fragments.RegattaFragment; +import com.sap.sailing.android.tracking.app.upload.UploadResponseHandler; +import com.sap.sailing.android.tracking.app.upload.UploadResult; +import com.sap.sailing.android.tracking.app.upload.UploadTeamImageTask; import com.sap.sailing.android.tracking.app.utils.AboutHelper; import com.sap.sailing.android.tracking.app.utils.AppPreferences; import com.sap.sailing.android.tracking.app.utils.BitmapHelper; @@ -60,12 +58,14 @@ import com.sap.sailing.android.tracking.app.valueobjects.CheckinData; import com.sap.sailing.android.tracking.app.valueobjects.CompetitorInfo; import com.sap.sailing.android.tracking.app.valueobjects.EventInfo; -public class RegattaActivity extends AbstractRegattaActivity implements RegattaFragment.FragmentWatcher { +public class RegattaActivity extends AbstractRegattaActivity + implements RegattaFragment.FragmentWatcher, UploadResponseHandler { private final static String TAG = RegattaActivity.class.getName(); private final static String LEADERBOARD_IMAGE_FILENAME_PREFIX = "leaderboardImage_"; private final static String FLAG_IMAGE_FILENAME_PREFIX = "flagImage_"; + public EventInfo event; public CompetitorInfo competitor; public LeaderboardInfo leaderboard; @@ -75,6 +75,7 @@ public class RegattaActivity extends AbstractRegattaActivity implements RegattaF private String checkinDigest; private CheckinManager manager; private AppPreferences prefs; + private File pictureFile; @Override protected void onCreate(Bundle savedInstanceState) { @@ -306,7 +307,7 @@ public class RegattaActivity extends AbstractRegattaActivity implements RegattaF * @param image */ private void storeImageAndSendToServer(Bitmap image, String fileName, boolean sendToServer) { - File pictureFile = getImageFile(fileName); + pictureFile = getImageFile(fileName); if (pictureFile == null) { Log.d(TAG, "Error creating media file, check storage permissions: ");// e.getMessage()); return; @@ -352,7 +353,7 @@ public class RegattaActivity extends AbstractRegattaActivity implements RegattaF } final String uploadURLStr = event.server + prefs.getServerUploadTeamImagePath().replace("{competitor_id}", competitor.id); - new UploadTeamImageTask(imageFile).execute(uploadURLStr); + new UploadTeamImageTask(this, imageFile, this).execute(uploadURLStr); } /** @@ -425,79 +426,6 @@ public class RegattaActivity extends AbstractRegattaActivity implements RegattaF setUpView(); } - private class UploadTeamImageTask extends AsyncTask { - File imageFile; - String uploadUrl; - - public UploadTeamImageTask(File imageFile) { - this.imageFile = imageFile; - } - - protected String doInBackground(String... urls) { - uploadUrl = urls[0]; - DataOutputStream outputStream = null; - FileInputStream imageInputStream = null; - BufferedReader reader = null; - try { - if (imageFile != null) { - URL url = new URL(uploadUrl); - HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); - urlConnection.setUseCaches(false); - urlConnection.setDoOutput(true); - urlConnection.setRequestMethod("POST"); - urlConnection.setRequestProperty("Content-Type", "image/jpeg"); - outputStream = new DataOutputStream(urlConnection.getOutputStream()); - - int nRead; - byte[] data = new byte[2048]; - imageInputStream = new FileInputStream(imageFile); - while ((nRead = imageInputStream.read(data, 0, data.length)) != -1) { - outputStream.write(data, 0, nRead); - } - imageInputStream.close(); - outputStream.flush(); - outputStream.close(); - Log.d(TAG, "Image upload response: " + urlConnection.getResponseCode()); - if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { - reader = new BufferedReader(new InputStreamReader((urlConnection.getInputStream()))); - StringBuilder builder = new StringBuilder(); - String output; - while ((output = reader.readLine()) != null) { - builder.append(output); - } - Log.d(TAG, "Response body: " + builder.toString()); - } - urlConnection.disconnect(); - } - } catch (IOException e) { - ExLog.e(RegattaActivity.this, TAG, "Error uploading image: " + e.getLocalizedMessage()); - cancel(true); - } finally { - if (outputStream != null) { - RegattaActivity.this.safeClose(outputStream); - } - if (imageInputStream != null) { - RegattaActivity.this.safeClose(imageInputStream); - } - if (reader != null) { - RegattaActivity.this.safeClose(reader); - } - } - return ""; - } - - @Override - protected void onCancelled() { - super.onCancelled(); - Toast.makeText(RegattaActivity.this, getString(R.string.error_sending_team_image_to_server), - Toast.LENGTH_LONG).show(); - } - - protected void onPostExecute(String result) { - // do something - } - } - private class DownloadLeaderboardImageTask extends AsyncTask { ImageView bmImage; String downloadUrl; @@ -668,4 +596,52 @@ public class RegattaActivity extends AbstractRegattaActivity implements RegattaF protected int getOptionsMenuResId() { return R.menu.options_menu_with_checkout; } + + @Override + public void onUploadTaskStarted() { + hideRetryUploadLayout(); + showUploadProgressLayout(); + } + + @Override + public void onUploadCancelled() { + Toast.makeText(this, getString(R.string.error_sending_team_image_to_server), Toast.LENGTH_LONG).show(); + } + + @Override + public void onUploadTaskFinished(UploadResult uploadResult) { + hideUploadProgressLayout(); + if (uploadResult.resultCode != 200) { + showRetryUploadLayout(); + } + Toast.makeText(this, uploadResult.resultCode + ": " + uploadResult.resultMessage, Toast.LENGTH_LONG).show(); + } + + public void retryUpload(View view) { + if (pictureFile != null) { + sendTeamImageToServer(pictureFile); + } else { + hideRetryUploadLayout(); + } + } + + private void showUploadProgressLayout() { + LinearLayout linearLayout = (LinearLayout) findViewById(R.id.upload_progress); + linearLayout.setVisibility(View.VISIBLE); + } + + private void hideUploadProgressLayout() { + LinearLayout linearLayout = (LinearLayout) findViewById(R.id.upload_progress); + linearLayout.setVisibility(View.GONE); + } + + private void showRetryUploadLayout() { + LinearLayout linearLayout1 = (LinearLayout) findViewById(R.id.retry_upload); + linearLayout1.setVisibility(View.VISIBLE); + } + + private void hideRetryUploadLayout() { + LinearLayout linearLayout1 = (LinearLayout) findViewById(R.id.retry_upload); + linearLayout1.setVisibility(View.GONE); + } } diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/upload/UploadResponseHandler.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/upload/UploadResponseHandler.java new file mode 100644 index 00000000000..c8fa87e9bb7 --- /dev/null +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/upload/UploadResponseHandler.java @@ -0,0 +1,12 @@ +package com.sap.sailing.android.tracking.app.upload; + +/** + * Interface that + * + * @author Teresa Holfeld, holfeld@ubilabs.net + */ +public interface UploadResponseHandler { + void onUploadTaskStarted(); + void onUploadCancelled(); + void onUploadTaskFinished(UploadResult uploadResult); +} diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/upload/UploadResult.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/upload/UploadResult.java new file mode 100644 index 00000000000..4f654361e40 --- /dev/null +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/upload/UploadResult.java @@ -0,0 +1,9 @@ +package com.sap.sailing.android.tracking.app.upload; + +/** + * @author Teresa Holfeld, holfeld@ubilabs.net + */ +public class UploadResult { + public String resultMessage; + public int resultCode; +} diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/upload/UploadTeamImageTask.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/upload/UploadTeamImageTask.java new file mode 100644 index 00000000000..59cf891ceb9 --- /dev/null +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/upload/UploadTeamImageTask.java @@ -0,0 +1,119 @@ +package com.sap.sailing.android.tracking.app.upload; + +import android.content.Context; +import android.os.AsyncTask; +import android.util.Log; +import android.widget.Toast; + +import com.sap.sailing.android.shared.logging.ExLog; +import com.sap.sailing.android.tracking.app.R; + +import java.io.BufferedReader; +import java.io.Closeable; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +/** + * Uploads an image to the server. + * + * @author Teresa Holfeld, holfeld@ubilabs.net + */ +public class UploadTeamImageTask extends AsyncTask { + + private static final String TAG = UploadTeamImageTask.class.getName(); + private final static int ERROR_IO = 600; + + private Context context; + private File imageFile; + private String uploadUrl; + private UploadResponseHandler uploadResponseHandler; + + public UploadTeamImageTask(Context context, File imageFile, UploadResponseHandler uploadResponseHandler) { + this.context = context; + this.imageFile = imageFile; + this.uploadResponseHandler = uploadResponseHandler; + } + + @Override + protected void onPreExecute() { + uploadResponseHandler.onUploadTaskStarted(); + } + + protected UploadResult doInBackground(String... urls) { + uploadUrl = urls[0]; + DataOutputStream outputStream = null; + FileInputStream imageInputStream = null; + BufferedReader reader = null; + UploadResult uploadResult = new UploadResult(); + try { + if (imageFile != null) { + URL url = new URL(uploadUrl); + HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); + urlConnection.setUseCaches(false); + urlConnection.setDoOutput(true); + urlConnection.setRequestMethod("POST"); + urlConnection.setRequestProperty("Content-Type", "image/jpeg"); + outputStream = new DataOutputStream(urlConnection.getOutputStream()); + + int nRead; + byte[] data = new byte[2048]; + imageInputStream = new FileInputStream(imageFile); + while ((nRead = imageInputStream.read(data, 0, data.length)) != -1) { + outputStream.write(data, 0, nRead); + } + imageInputStream.close(); + outputStream.flush(); + outputStream.close(); + uploadResult.resultCode = urlConnection.getResponseCode(); + uploadResult.resultMessage = urlConnection.getResponseMessage(); + Log.d(TAG, "Image upload response: " + uploadResult.resultCode); + if (uploadResult.resultCode == HttpURLConnection.HTTP_OK) { + reader = new BufferedReader(new InputStreamReader((urlConnection.getInputStream()))); + StringBuilder builder = new StringBuilder(); + String output; + while ((output = reader.readLine()) != null) { + builder.append(output); + } + Log.d(TAG, "Response body: " + builder.toString()); + } + urlConnection.disconnect(); + } + } catch (IOException e) { + uploadResult.resultCode = ERROR_IO; + uploadResult.resultMessage = context.getString(R.string.upload_io_error) + e.getLocalizedMessage(); + ExLog.e(context, TAG, uploadResult.resultCode + ": " + uploadResult.resultMessage); + } finally { + safeClose(outputStream); + safeClose(imageInputStream); + safeClose(reader); + } + return uploadResult; + } + + @Override + protected void onCancelled() { + super.onCancelled(); + uploadResponseHandler.onUploadCancelled(); + } + + @Override + protected void onPostExecute(UploadResult uploadResult) { + uploadResponseHandler.onUploadTaskFinished(uploadResult); + uploadResponseHandler = null; + } + + private void safeClose(Closeable c) { + if (c != null) { + try { + c.close(); + } catch (IOException e) { + ExLog.ex(context, TAG, e); + } + } + } +} diff --git a/mobile/com.sap.sailing.buoy.positioning/res/drawable/working_title.png b/mobile/com.sap.sailing.buoy.positioning/res/drawable/working_title.png new file mode 100644 index 00000000000..251d4ba7973 Binary files /dev/null and b/mobile/com.sap.sailing.buoy.positioning/res/drawable/working_title.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/corner_dark_12dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/corner_dark_12dp.png deleted file mode 100644 index bd7d89a4389..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/corner_dark_12dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/corner_dark_20dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/corner_dark_20dp.png deleted file mode 100644 index 0ea7ab6f878..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/corner_dark_20dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/corner_light_12dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/corner_light_12dp.png deleted file mode 100644 index f50d0ecfd2b..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/corner_light_12dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/corner_light_20dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/corner_light_20dp.png deleted file mode 100644 index 4db7d8ff3aa..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/corner_light_20dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/corner_dark_12dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/corner_dark_12dp.png deleted file mode 100644 index 2810124d491..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/corner_dark_12dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/corner_dark_20dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/corner_dark_20dp.png deleted file mode 100644 index 166e0574d72..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/corner_dark_20dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/corner_light_12dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/corner_light_12dp.png deleted file mode 100644 index f727238afd6..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/corner_light_12dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/corner_light_20dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/corner_light_20dp.png deleted file mode 100644 index 27f200aa500..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/corner_light_20dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-sw600dp/backdrop.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-sw600dp/backdrop.png new file mode 100644 index 00000000000..91ba46e5c76 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-sw600dp/backdrop.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-sw600dp/corner_dark.xml b/mobile/com.sap.sailing.racecommittee.app/res/drawable-sw600dp/corner_dark.xml deleted file mode 100644 index 6f0e359e302..00000000000 --- a/mobile/com.sap.sailing.racecommittee.app/res/drawable-sw600dp/corner_dark.xml +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-sw600dp/corner_light.xml b/mobile/com.sap.sailing.racecommittee.app/res/drawable-sw600dp/corner_light.xml deleted file mode 100644 index b2be3bcd2a4..00000000000 --- a/mobile/com.sap.sailing.racecommittee.app/res/drawable-sw600dp/corner_light.xml +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/corner_dark_12dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/corner_dark_12dp.png deleted file mode 100644 index 465036ce555..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/corner_dark_12dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/corner_dark_20dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/corner_dark_20dp.png deleted file mode 100644 index e0f66cf463b..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/corner_dark_20dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/corner_light_12dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/corner_light_12dp.png deleted file mode 100644 index 35ee59eda91..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/corner_light_12dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/corner_light_20dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/corner_light_20dp.png deleted file mode 100644 index 709a3758cce..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/corner_light_20dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/corner_dark_12dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/corner_dark_12dp.png deleted file mode 100644 index 4d425ec20c3..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/corner_dark_12dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/corner_dark_20dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/corner_dark_20dp.png deleted file mode 100644 index 71b31e165aa..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/corner_dark_20dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/corner_light_12dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/corner_light_12dp.png deleted file mode 100644 index bc26d0b7fa6..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/corner_light_12dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/corner_light_20dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/corner_light_20dp.png deleted file mode 100644 index f023592582c..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/corner_light_20dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/corner_dark_12dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/corner_dark_12dp.png deleted file mode 100644 index 18903370a97..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/corner_dark_12dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/corner_dark_20dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/corner_dark_20dp.png deleted file mode 100644 index 3deaeb0374e..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/corner_dark_20dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/corner_light_12dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/corner_light_12dp.png deleted file mode 100644 index 465214a908d..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/corner_light_12dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/corner_light_20dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/corner_light_20dp.png deleted file mode 100644 index fffe4acfa3f..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/corner_light_20dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable/backdrop.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable/backdrop.png index aef737082d5..51095cd4595 100644 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable/backdrop.png and b/mobile/com.sap.sailing.racecommittee.app/res/drawable/backdrop.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable/corner_dark.xml b/mobile/com.sap.sailing.racecommittee.app/res/drawable/corner_dark.xml deleted file mode 100644 index 40591b5b491..00000000000 --- a/mobile/com.sap.sailing.racecommittee.app/res/drawable/corner_dark.xml +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable/corner_light.xml b/mobile/com.sap.sailing.racecommittee.app/res/drawable/corner_light.xml deleted file mode 100644 index 290df38c8b8..00000000000 --- a/mobile/com.sap.sailing.racecommittee.app/res/drawable/corner_light.xml +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable/nav_drawer_header.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable/nav_drawer_header.png index f0ca3537590..01fab551c38 100644 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable/nav_drawer_header.png and b/mobile/com.sap.sailing.racecommittee.app/res/drawable/nav_drawer_header.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_backdrop_normal.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_backdrop_normal.xml index b3949a73922..b068025f5b0 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/layout/login_backdrop_normal.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/login_backdrop_normal.xml @@ -35,62 +35,70 @@ android:textColor="@color/constant_white" android:textSize="@dimen/textSize_40" /> - - - - - - + android:layout_height="wrap_content" + android:background="@color/constant_black_transparent" + android:id="@+id/gradient" + android:alpha="0"> - + + + + + + + + + - - - - - - - - - - + android:alpha="0"> - + + + + + + + + + + + + + + + diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml index 7f3f5be5873..2253f7c223a 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml @@ -465,5 +465,7 @@ Group Race Select Race \'%1$s\' zur Ergebnisliste hinzugefügt an Position %2$s + Getting Started + http://www.sapsailing.com/gwt/Home.html?locale=de#SolutionsPlace:navigationTab=RaceCommitteeApp \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/attrs.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/attrs.xml index 6607efeaa6d..fbc0ee44064 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values/attrs.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values/attrs.xml @@ -59,7 +59,6 @@ - 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 a94858eefd2..5fbeeb129f2 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml @@ -492,5 +492,7 @@ Group Racing Select Race Added \'%1$s\' to result list at position %2$s + Getting Started + http://www.sapsailing.com/gwt/Home.html?locale=en#SolutionsPlace:navigationTab=RaceCommitteeApp \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/themes_dark.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/themes_dark.xml index daa5707d977..9a4bc79e61c 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values/themes_dark.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values/themes_dark.xml @@ -70,7 +70,6 @@ @drawable/ic_create_dark @drawable/compass_back_dark @drawable/compass_needle_dark - @drawable/corner_dark @drawable/course_triangle_48dp_dark @drawable/course_triangle_64dp_dark @drawable/course_updown_48dp_dark diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/themes_light.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/themes_light.xml index 85f9155d5f3..7011ae30a3e 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values/themes_light.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values/themes_light.xml @@ -79,7 +79,6 @@ @drawable/ic_create_light @drawable/compass_back_light @drawable/compass_needle_light - @drawable/corner_light @drawable/course_triangle_48dp_light @drawable/course_triangle_64dp_light @drawable/course_updown_48dp_light 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 37c0403a88b..346957719f2 100755 --- 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 @@ -19,7 +19,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.os.Handler; -import android.support.annotation.Nullable; +import android.support.annotation.NonNull; import android.support.v4.content.LocalBroadcastManager; import android.text.TextUtils; import android.view.View; @@ -508,6 +508,7 @@ public class LoginActivity extends BaseActivity animators.add(heightAnimation); animators.add(frameAnimation); animators.add(getAlphaRevAnimator(findViewById(R.id.backdrop_title))); + animators.add(getAlphaAnimator(findViewById(R.id.gradient))); animators.add(getAlphaAnimator(findViewById(R.id.backdrop_login))); animators.add(getAlphaAnimator(findViewById(R.id.backdrop_onboarding))); animators.add(getAlphaAnimator(findViewById(R.id.button_bar))); @@ -520,11 +521,11 @@ public class LoginActivity extends BaseActivity animatorSet.start(); } - private ObjectAnimator getAlphaAnimator(@Nullable Object target) { + private ObjectAnimator getAlphaAnimator(@NonNull Object target) { return ObjectAnimator.ofFloat(target, "alpha", 0f, 1f); } - private ObjectAnimator getAlphaRevAnimator(@Nullable Object target) { + private ObjectAnimator getAlphaRevAnimator(@NonNull Object target) { return ObjectAnimator.ofFloat(target, "alpha", 1f, 0f); } 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 8aab517686e..c13330f480f 100755 --- 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 @@ -34,7 +34,6 @@ import android.view.ViewTreeObserver; import android.view.Window; import android.widget.ImageView; import android.widget.ProgressBar; -import android.widget.TextView; import android.widget.Toast; import com.sap.sailing.android.shared.logging.ExLog; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/PanelsAdapter.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/PanelsAdapter.java index bc7f3ca8175..895c9f34607 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/PanelsAdapter.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/PanelsAdapter.java @@ -5,7 +5,6 @@ import android.app.FragmentManager; import android.os.Bundle; import android.support.v13.app.FragmentStatePagerAdapter; -import com.sap.sailing.racecommittee.app.ui.fragments.panels.MorePanelFragment; import com.sap.sailing.racecommittee.app.ui.fragments.panels.SetupPanelFragment; import com.sap.sailing.racecommittee.app.ui.fragments.panels.TimePanelFragment; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/LoginOnboarding.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/LoginOnboarding.java index 00c99746a82..afacb98e747 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/LoginOnboarding.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/LoginOnboarding.java @@ -10,12 +10,16 @@ import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AlertDialog; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.style.UnderlineSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.Button; import android.widget.EditText; +import android.widget.TextView; import android.widget.Toast; import com.sap.sailing.android.shared.util.ViewHelper; @@ -37,6 +41,20 @@ public class LoginOnboarding extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View layout = inflater.inflate(R.layout.login_onboarding, container, false); + TextView link = ViewHelper.get(layout, R.id.get_started); + if (link != null) { + SpannableString string = new SpannableString(link.getText()); + string.setSpan(new UnderlineSpan(), 0, string.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + link.setText(string); + link.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.get_started_url))); + startActivity(intent); + } + }); + } + Button scan = ViewHelper.get(layout, R.id.scanQr); if (scan != null) { scan.setOnClickListener(new View.OnClickListener() { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/GeneralPreferenceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/GeneralPreferenceFragment.java index 3436960e568..687ba0d1e6d 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/GeneralPreferenceFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/GeneralPreferenceFragment.java @@ -1,5 +1,7 @@ package com.sap.sailing.racecommittee.app.ui.fragments.preference; +import java.net.URL; + import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; @@ -26,9 +28,6 @@ import com.sap.sailing.racecommittee.app.utils.UrlHelper; import com.sap.sailing.racecommittee.app.utils.autoupdate.AutoUpdater; import com.sap.sse.common.Util; -import java.net.MalformedURLException; -import java.net.URL; - public class GeneralPreferenceFragment extends BasePreferenceFragment { private static int requestCodeQRCode = 45392; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/autoupdate/AutoUpdaterChecker.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/autoupdate/AutoUpdaterChecker.java index 3cada99a486..70f9b13efd6 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/autoupdate/AutoUpdaterChecker.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/autoupdate/AutoUpdaterChecker.java @@ -10,8 +10,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnClickListener; -import android.graphics.drawable.Drawable; -import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.widget.Toast;