diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/base/racegroup/impl/CurrentRaceFilterImplTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/base/racegroup/impl/CurrentRaceFilterImplTest.java index 8f70f450868..c1a488d5090 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/base/racegroup/impl/CurrentRaceFilterImplTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/base/racegroup/impl/CurrentRaceFilterImplTest.java @@ -35,7 +35,7 @@ public class CurrentRaceFilterImplTest { RaceFragment firstRace = new RaceFragment(RaceLogRaceStatus.UNSCHEDULED); values.add(firstRace); - List result = fixture.filterCurrentRaces(values); + List result = fixture.getCurrentRaces(); Assert.assertThat(result.size(), Matchers.equalTo(2)); Assert.assertThat(result.get(0), Matchers.equalTo(fristSeries)); Assert.assertThat(result.get(1), Matchers.equalTo(firstRace)); @@ -49,14 +49,14 @@ public class CurrentRaceFilterImplTest { values.addAll(createRacesForSeries(3, seriesBase1)); values.addAll(createRacesForSeries(3, seriesBase2)); - List result = fixture.filterCurrentRaces(values); + List result = fixture.getCurrentRaces(); Assert.assertThat(result.size(), Matchers.equalTo(2)); Assert.assertThat(result.get(0), Matchers.equalTo(values.get(0))); Assert.assertThat(result.get(1), Matchers.equalTo(values.get(1))); ((RaceFragment) values.get(5)).setCurrentStatus(RaceLogRaceStatus.PRESCHEDULED); - result = fixture.filterCurrentRaces(values); + result = fixture.getCurrentRaces(); Assert.assertThat(result.size(), Matchers.equalTo(5)); Assert.assertThat(result.get(0), Matchers.equalTo(values.get(0))); Assert.assertThat(result.get(1), Matchers.equalTo(values.get(1))); @@ -66,7 +66,7 @@ public class CurrentRaceFilterImplTest { ((RaceFragment) values.get(5)).setCurrentStatus(RaceLogRaceStatus.RUNNING); - result = fixture.filterCurrentRaces(values); + result = fixture.getCurrentRaces(); Assert.assertThat(result.size(), Matchers.equalTo(3)); Assert.assertThat(result.get(0), Matchers.equalTo(values.get(4))); Assert.assertThat(result.get(1), Matchers.equalTo(values.get(5))); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java index 476e5238d7a..889c5b9d27e 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/RaceStatusAnalyzer.java @@ -44,9 +44,10 @@ public class RaceStatusAnalyzer extends RaceLogAnalyzer { @Override protected RaceLogRaceStatus performAnalysis() { - ArrayListNavigableSet statusEvents = new ArrayListNavigableSet<>(RaceLogRaceStatusEventComparator.INSTANCE); - for(RaceLogEvent event: getPassEvents()) { - if(event instanceof RaceLogRaceStatusEvent) { + ArrayListNavigableSet statusEvents = new ArrayListNavigableSet<>( + RaceLogRaceStatusEventComparator.INSTANCE); + for (RaceLogEvent event : getPassEvents()) { + if (event instanceof RaceLogRaceStatusEvent) { statusEvents.add((RaceLogRaceStatusEvent) event); } } @@ -54,7 +55,6 @@ public class RaceStatusAnalyzer extends RaceLogAnalyzer { event.accept(eventDispatcher); return eventDispatcher.nextStatus; } - return RaceLogRaceStatus.UNSCHEDULED; } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/CurrentRaceFilter.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/CurrentRaceFilter.java index 8d4ca29da0b..1dcd61afa97 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/CurrentRaceFilter.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/CurrentRaceFilter.java @@ -12,6 +12,6 @@ import com.sap.sailing.domain.abstractlog.race.state.RaceState; * @author Charlotte Proeller (D062347) * @author Axel Uhl (d043530) */ -public interface CurrentRaceFilter { - Set filterCurrentRaces(Set allRaces); +public interface CurrentRaceFilter { + Set getCurrentRaces(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/FilterableRace.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/FilterableRace.java index b047e385999..e510c87c421 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/FilterableRace.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/FilterableRace.java @@ -40,4 +40,6 @@ public interface FilterableRace { int getZeroBasedIndexInFleet(); int getZeroBasedSeriesIndex(); + + String getRaceColumnName(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceGroupSeries.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceGroupSeries.java index 5151c9f6cc0..41048c76332 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceGroupSeries.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceGroupSeries.java @@ -20,13 +20,17 @@ public class RaceGroupSeries { private int seriesOrder; public RaceGroupSeries(FilterableRace race) { - raceGroup = race.getRaceGroup(); - series = race.getSeries(); - seriesOrder = getSeriesIndex(race, series); + this(race.getRaceGroup(), race.getSeries()); } - private static int getSeriesIndex(FilterableRace race, SeriesBase series) { - return Util.indexOf(race.getRaceGroup().getSeries(), series); + public RaceGroupSeries(RaceGroup raceGroup, SeriesBase series) { + this.raceGroup = raceGroup; + this.series = series; + seriesOrder = getSeriesIndex(raceGroup, series); + } + + private static int getSeriesIndex(RaceGroup raceGroup, SeriesBase series) { + return Util.indexOf(raceGroup.getSeries(), series); } public RaceGroup getRaceGroup() { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/RaceGroupSeriesFleet.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceGroupSeriesFleet.java similarity index 88% rename from mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/RaceGroupSeriesFleet.java rename to java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceGroupSeriesFleet.java index 860677dc3e8..5bb3fcf0894 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/impl/RaceGroupSeriesFleet.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceGroupSeriesFleet.java @@ -1,11 +1,8 @@ -package com.sap.sailing.racecommittee.app.domain.impl; +package com.sap.sailing.domain.base.racegroup; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.SeriesBase; -import com.sap.sailing.domain.base.racegroup.RaceGroup; -import com.sap.sailing.domain.base.racegroup.RaceGroupSeries; import com.sap.sailing.domain.common.LeaderboardNameConstants; -import com.sap.sailing.racecommittee.app.domain.ManagedRace; import com.sap.sse.common.Util; /** @@ -22,11 +19,17 @@ public class RaceGroupSeriesFleet extends RaceGroupSeries { private Fleet fleet; private int fleetOrder; - public RaceGroupSeriesFleet(ManagedRace race) { + public RaceGroupSeriesFleet(FilterableRace race) { super(race); fleet = race.getFleet(); fleetOrder = getFleetIndex(race.getSeries().getFleets(), race.getFleet()); } + + public RaceGroupSeriesFleet(RaceGroup raceGroup, SeriesBase series, Fleet fleet) { + super(raceGroup, series); + this.fleet = fleet; + getFleetIndex(series.getFleets(), fleet); + } private int getFleetIndex(Iterable fleets, Fleet fleet) { return Util.indexOf(fleets, fleet); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceGroupSeriesFleetRaceColumn.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceGroupSeriesFleetRaceColumn.java new file mode 100644 index 00000000000..9b00b83183c --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceGroupSeriesFleetRaceColumn.java @@ -0,0 +1,56 @@ +package com.sap.sailing.domain.base.racegroup; + +import com.sap.sailing.domain.base.Fleet; +import com.sap.sailing.domain.base.SeriesBase; + +/** + * Represents a quadruple of {@link RaceGroup} (representing a regatta or a flexible leaderboard), a {@link SeriesBase + * series}, a {@link Fleet} and a race column, identified by its unique name within the leaderboard. An instance can be + * constructed for a {@link FilterableRace} which then extracts these four properties from the race. Equal + * objects of this type can only result for equal races because they identify a "race slot" in a regatta. + * + * @author Axel Uhl (d043530) + * + */ +public class RaceGroupSeriesFleetRaceColumn extends RaceGroupSeriesFleet { + private final String raceColumnName; + + public RaceGroupSeriesFleetRaceColumn(FilterableRace race) { + super(race); + raceColumnName = race.getRaceColumnName(); + } + + public RaceGroupSeriesFleetRaceColumn(RaceGroup raceGroup, SeriesBase series, Fleet fleet, String raceColumnName) { + super(raceGroup, series, fleet); + this.raceColumnName = raceColumnName; + } + + public String getRaceColumnName() { + return raceColumnName; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((raceColumnName == null) ? 0 : raceColumnName.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + RaceGroupSeriesFleetRaceColumn other = (RaceGroupSeriesFleetRaceColumn) obj; + if (raceColumnName == null) { + if (other.raceColumnName != null) + return false; + } else if (!raceColumnName.equals(other.raceColumnName)) + return false; + return true; + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/SeriesWithRows.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/SeriesWithRows.java index 2e1604bf79a..90dbbc216fd 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/SeriesWithRows.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/SeriesWithRows.java @@ -1,5 +1,6 @@ package com.sap.sailing.domain.base.racegroup; +import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.SeriesBase; /** @@ -11,5 +12,7 @@ public interface SeriesWithRows extends SeriesBase { /** * All {@link RaceRow}s of this series. */ - public Iterable getRaceRows(); + Iterable getRaceRows(); + + RaceRow getRaceRow(Fleet fleet); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/CurrentRaceFilterImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/CurrentRaceFilterImpl.java index 323c2767092..3741597a08f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/CurrentRaceFilterImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/CurrentRaceFilterImpl.java @@ -1,142 +1,180 @@ package com.sap.sailing.domain.base.racegroup.impl; -import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; +import java.util.Iterator; import java.util.Map; import java.util.Set; +import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.SeriesBase; import com.sap.sailing.domain.base.racegroup.CurrentRaceFilter; import com.sap.sailing.domain.base.racegroup.FilterableRace; -import com.sap.sailing.domain.base.racegroup.IsFleetFragment; -import com.sap.sailing.domain.base.racegroup.IsRaceFragment; -import com.sap.sailing.domain.base.racegroup.RaceGroupFragment; +import com.sap.sailing.domain.base.racegroup.RaceCell; +import com.sap.sailing.domain.base.racegroup.RaceGroup; +import com.sap.sailing.domain.base.racegroup.RaceGroupSeriesFleet; +import com.sap.sailing.domain.base.racegroup.RaceGroupSeriesFleetRaceColumn; +import com.sap.sailing.domain.base.racegroup.RaceRow; +import com.sap.sailing.domain.base.racegroup.SeriesWithRows; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; +import com.sap.sse.common.Util; -public class CurrentRaceFilterImpl implements CurrentRaceFilter { +/** + * Determines a subset from a set of {@link FilterableRace} objects based on a definition of "being current." Current + * races are interesting for a race officer to deal with. For example, the next set of races that are eligible for being + * scheduled are part of this set; furthermore all running races. See {@link #getCurrentRaces()} for a more formal + * definition what this filter considers to be a "current" race. + *

+ * + * An instance of this type is initialized with the full set of races out of which the "current" subset shall be + * extracted by the {@link #getCurrentRaces()} method. The full set of races is expected to skip no race columns and no + * fleets and no series, or in other words, hold all races that form the regatta structure. This is important for the + * "predecessor" relation which uses the fleet and series indices, such as + * {@link FilterableRace#getZeroBasedIndexInFleet()} and {@link FilterableRace#getZeroBasedSeriesIndex()}. + * + * @author Axel Uhl (d043530) + * + * @param + */ +public class CurrentRaceFilterImpl implements CurrentRaceFilter { + private final Set allRaces; + private final Map racesByRaceGroupSeriesFleet; + public CurrentRaceFilterImpl(Set allRaces) { + this.allRaces = allRaces; + this.racesByRaceGroupSeriesFleet = new HashMap<>(); + for (final T race : allRaces) { + racesByRaceGroupSeriesFleet.put(new RaceGroupSeriesFleet(race), race); + } + } + + /** + * A race is considered "current" and shall be shown if its status is between (inclusive) + * {@link RaceLogRaceStatus#SCHEDULED} and {@link RaceLogRaceStatus#FINISHING}, or if the race + * has no predecessor in the regatta / leaderboard and therefore could start the regatta, + * or if the race has an immediate predecessor (a race A that must precede the race in question, say X, + * such that there is no other race B that also must precede X with A having to precede B) which + * is at least in state {@link RaceLogRaceStatus#SCHEDULED}. + */ @Override - public Set filterCurrentRaces(Set allRaces) { + public Set getCurrentRaces() { final Set filteredRaces = new HashSet<>(); - - // TODO implement the CurrentRaceFilter algorithm here... - filteredRaces.addAll(allRaces); + for (final T race : allRaces) { + if ((race.getStatus().getOrderNumber() >= RaceLogRaceStatus.SCHEDULED.getOrderNumber() && + race.getStatus().getOrderNumber() <= RaceLogRaceStatus.FINISHING.getOrderNumber()) || + hasNoPredecessor(race) || + hasImmediatePredecessorThatIsAtLeastScheduled(race)) { + // show the race + filteredRaces.add(race); + } + } return filteredRaces; } - private Map> removeAllListsBeforeLastStarted(Map> filteredRaces) { - Map> result; - IsFleetFragment keyOfLastStartedRace = null; - for (IsFleetFragment currentKey : filteredRaces.keySet()) { - if (containsActiceRace(filteredRaces.get(currentKey))) { - keyOfLastStartedRace = currentKey; - } - } - if (keyOfLastStartedRace != null) { - result = new LinkedHashMap<>(); - boolean found = false; - for (IsFleetFragment currentKey : filteredRaces.keySet()) { - if (found) { - result.put(currentKey, filteredRaces.get(currentKey)); - } else if (currentKey.equals(keyOfLastStartedRace)) { - found = true; - result.put(currentKey, filteredRaces.get(currentKey)); - } + /** + * For a race to have no predecessor in the regatta structure it has to be located in the first race column in the first series. + * If the races of the different fleets in the series may {@link SeriesBase#isFleetsRunInParallel() run in parallel} then this is + * already sufficient. If the races of the different fleets in the series are run in sequence, the race must additionally be + * in the first fleet of the series. + */ + private boolean hasNoPredecessor(FilterableRace race) { + return race.getZeroBasedSeriesIndex() == 0 && race.getZeroBasedIndexInFleet() == 0 && + (race.getSeries().isFleetsRunInParallel() || Util.indexOf(race.getSeries().getFleets(), race.getFleet()) == 0); + } + + /** + * Two cases need to be distinguished: the races in different fleets of the same series may be run + * in parallel or not.

+ * + * Parallel fleets in series: the immediate predecessor is the race in the same fleet in the immediately preceding + * race column; or if {@code race} is in the first column of its series, all races in the last column of the immediately + * preceding series.

+ * + * Sequential fleets in series: the immediate predecessor is the race that immediately precedes {@code race} in + * the list of races constructed by looping over all columns of the series and for each column looping over all + * fleets. If {@code race} is the first in this sequence of its series, then the immediate predecessors is/are the + * last race(s) (multiple if the previous series runs its fleets in parallel) of the immediately preceding series.

+ * + * Precondition: {@code !hasNoPredecessor(race)} + * + * @return whether any of the predecessors (of which there is least one because of the precondition) have a + * {@link RaceLogRaceStatus race status} whose {@link RaceLogRaceStatus#getOrderNumber() order number} is at least + * {@link RaceLogRaceStatus#SCHEDULED SCHEDULED.getOrderNumber()}. + */ + private boolean hasImmediatePredecessorThatIsAtLeastScheduled(FilterableRace race) { + final Set immediatePredecessors = new HashSet<>(); + final RaceGroup raceGroup = race.getRaceGroup(); + if (race.getSeries().isFleetsRunInParallel()) { + if (race.getZeroBasedIndexInFleet() == 0) { + // it's in the first column; for fleets that may run in parallel, the immediate predecessors are + // in the last column of the immediately preceding series: + Util.addAll(getLastRacesFromImmediatelyPrecedingSeries(race, raceGroup), immediatePredecessors); + } else { + // not the first race column in its fleet; for parallel fleets, only the immediate predecessor + // in the same fleet is an immediate predecessor for race + RaceRow raceRow = Util.get(raceGroup.getSeries(), race.getZeroBasedSeriesIndex()).getRaceRow(race.getFleet()); + RaceCell previousCellInFleet = Util.get(raceRow.getCells(), race.getZeroBasedIndexInFleet()-1); + immediatePredecessors.add(racesByRaceGroupSeriesFleet.get( + new RaceGroupSeriesFleetRaceColumn(raceGroup, race.getSeries(), race.getFleet(), previousCellInFleet.getName()))); } } else { - result = filteredRaces; - } - return result; - } - - private boolean containsActiceRace(List races) { - for (IsRaceFragment race : races) { - if (RaceLogRaceStatus.isRunningOrFinished(race.getCurrentStatus())) { - return true; - } - } - return false; - } - - /** - * method maps the races to fleets/series and removes all that should be not shown with "A follows B" relationship - * - * @param allItems - * All SORTED Items - * @return all current Races mapped to there fleet/series - */ - private Map> filterRaces(Collection allItems) { - Map> mappedItems = mapItems(allItems); - List newValueForKey = null; - SeriesBase firstSeries = mappedItems.keySet().iterator().next().getSeries(); - for (IsFleetFragment currentKey : mappedItems.keySet()) { - newValueForKey = filterWithFollowing(mappedItems.get(currentKey), - currentKey.getSeries().equals(firstSeries)); - mappedItems.put(currentKey, newValueForKey); - } - - return mappedItems; - } - - /** - * Filters a List (with races of the same series and fleet). - * - * @param list - * @return - */ - private List filterWithFollowing(List races, boolean isFirstSeries) { - List result = new LinkedList<>(); - boolean addNext = isFirstSeries; - for (IsRaceFragment currentRace : races) { - if (hasShowingStatus(currentRace)) { - result.add(currentRace); - addNext = true; - } else if (addNext) { - result.add(currentRace); - addNext = false; - } - } - return result; - } - - /** - * Checks if the status is A Status to Show - * - * @param currentRace - * @return - */ - private boolean hasShowingStatus(IsRaceFragment currentRace) { - return RaceLogRaceStatus.isActive(currentRace.getCurrentStatus()) - || RaceLogRaceStatus.isActive(currentRace.getCurrentStatus()); - } - - /** - * maps the Races to there Fleet/series - * - * @param allItems - * @return - */ - private Map> mapItems(Collection allItems) { - Map> resultMap = new LinkedHashMap<>(); - IsFleetFragment currentKey = null; - List currentValue = null; - for (T currentItem : allItems) { - if (currentItem instanceof IsFleetFragment) { - if (currentKey != null && currentValue != null) { - resultMap.put(currentKey, currentValue); - } - currentKey = (IsFleetFragment) currentItem; - currentValue = new LinkedList<>(); + // race's series is run sequentially, within one race column one fleet after the other, in the order of the + // fleets as specified by the series; the immediate predecessor is within this series the previous element in this + // ordering, or the last race(s) from the immediately preceding series if race is in the first column's first fleet. + final int zeroBasedIndexOfFleetInSeries = Util.indexOf(race.getSeries().getFleets(), race.getFleet()); + if (race.getZeroBasedIndexInFleet() == 0 && zeroBasedIndexOfFleetInSeries == 0) { + Util.addAll(getLastRacesFromImmediatelyPrecedingSeries(race, raceGroup), immediatePredecessors); } else { - currentValue.add((IsRaceFragment) currentItem); + final Fleet fleetOfImmediatelyPrecedingRace; + final int zeroBasedIndexOfImmediatelyPrecedingRaceInFleet; + if (zeroBasedIndexOfFleetInSeries == 0) { + // race is in first fleet; wrap around to last fleet in immediately preceding column + fleetOfImmediatelyPrecedingRace = Util.last(race.getSeries().getFleets()); + zeroBasedIndexOfImmediatelyPrecedingRaceInFleet = race.getZeroBasedIndexInFleet() - 1; + } else { + fleetOfImmediatelyPrecedingRace = Util.get(race.getSeries().getFleets(), zeroBasedIndexOfFleetInSeries-1); + zeroBasedIndexOfImmediatelyPrecedingRaceInFleet = race.getZeroBasedIndexInFleet(); + } + final RaceGroupSeriesFleetRaceColumn identifierOfImmediatelyPrecedingRace = + new RaceGroupSeriesFleetRaceColumn(raceGroup, race.getSeries(), fleetOfImmediatelyPrecedingRace, + Util.get(Util.get(raceGroup.getSeries(), race.getZeroBasedSeriesIndex()).getRaceRow( + fleetOfImmediatelyPrecedingRace).getCells(), zeroBasedIndexOfImmediatelyPrecedingRaceInFleet).getName()); + immediatePredecessors.add(racesByRaceGroupSeriesFleet.get(identifierOfImmediatelyPrecedingRace)); } } - if (currentKey != null && currentValue != null) { - resultMap.put(currentKey, currentValue); + final Iterator i = immediatePredecessors.iterator(); + boolean result = false; + while (!result && i.hasNext()) { + final RaceLogRaceStatus nextStatus = i.next().getStatus(); + result = nextStatus.getOrderNumber() >= RaceLogRaceStatus.SCHEDULED.getOrderNumber(); } - return resultMap; + return result; + } + + private Iterable getLastRacesFromImmediatelyPrecedingSeries(FilterableRace race, final RaceGroup raceGroup) { + final Set lastRacesInImmediatelyPrecedingSeries = new HashSet<>(); + final SeriesWithRows immediatelyPrecedingSeries = Util.get(raceGroup.getSeries(), race.getZeroBasedSeriesIndex()-1); + if (immediatelyPrecedingSeries.isFleetsRunInParallel()) { + // add all last races of all fleets in immediately preceding series because they may be run in parallel + for (final RaceRow rowInImmediatelyPrecedingSeries : immediatelyPrecedingSeries.getRaceRows()) { + final T lastRaceInRow = getLastRaceInRow(raceGroup, immediatelyPrecedingSeries, rowInImmediatelyPrecedingSeries); + lastRacesInImmediatelyPrecedingSeries.add(lastRaceInRow); + } + } else { + // add only the last race of the last fleet in the immediately preceding series + final RaceRow lastRowInImmediatelyPrecedingSeries = Util.last(immediatelyPrecedingSeries.getRaceRows()); + lastRacesInImmediatelyPrecedingSeries.add(getLastRaceInRow(raceGroup, immediatelyPrecedingSeries, lastRowInImmediatelyPrecedingSeries)); + } + return lastRacesInImmediatelyPrecedingSeries; + } + + private T getLastRaceInRow(final RaceGroup raceGroup, final SeriesWithRows immediatelyPrecedingSeries, + final RaceRow rowInImmediatelyPrecedingSeries) { + final RaceCell lastCell = Util.last(rowInImmediatelyPrecedingSeries.getCells()); + RaceGroupSeriesFleetRaceColumn identifierOfALastRaceInImmediatelyPrecedingSeries = + new RaceGroupSeriesFleetRaceColumn(raceGroup, immediatelyPrecedingSeries, + rowInImmediatelyPrecedingSeries.getFleet(), lastCell.getName()); + final T lastRaceInRow = racesByRaceGroupSeriesFleet.get(identifierOfALastRaceInImmediatelyPrecedingSeries); + return lastRaceInRow; } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/RaceRowImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/RaceRowImpl.java index 16a4d2a7d38..9be6959994a 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/RaceRowImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/RaceRowImpl.java @@ -9,6 +9,10 @@ public class RaceRowImpl implements RaceRow { private Fleet fleet; private Iterable races; + /** + * @param races + * expected to be provided in the order in which the race columns appear in the series / leaderboard + */ public RaceRowImpl(Fleet fleet, Iterable races) { this.fleet = fleet; this.races = races; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/SeriesWithRowsImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/SeriesWithRowsImpl.java index fa5aa6c7126..9c925c3935f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/SeriesWithRowsImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/SeriesWithRowsImpl.java @@ -20,18 +20,32 @@ public class SeriesWithRowsImpl implements SeriesWithRows { this.isMedal = isMedal; } + @Override public String getName() { return name; } + @Override public boolean isMedal() { return isMedal; } + @Override public Iterable getRaceRows() { return raceRows; } + @Override + public RaceRow getRaceRow(Fleet fleet) { + for (final RaceRow row : getRaceRows()) { + if (row.getFleet().equals(fleet)) { + return row; + } + } + return null; + } + + @Override public Iterable getFleets() { Collection fleets = new ArrayList(); for (RaceRow row : raceRows) { diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racegroup/impl/RaceRowDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racegroup/impl/RaceRowDeserializer.java index 53d75393e6d..e4f22b84f44 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racegroup/impl/RaceRowDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racegroup/impl/RaceRowDeserializer.java @@ -28,6 +28,7 @@ public class RaceRowDeserializer implements JsonDeserializer { public RaceRow deserialize(JSONObject object) throws JsonDeserializationException { JSONObject fleetObject = Helpers.toJSONObjectSafe(object.get(RaceRowJsonSerializer.FIELD_FLEET)); + // the race cells are expected to be written in the order of the race columns in the series / leaderboard JSONArray cellsObject = Helpers.getNestedArraySafe(object, RaceRowJsonSerializer.FIELD_RACE_CELLS); Collection races = new ArrayList(); diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racegroup/impl/RaceRowJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racegroup/impl/RaceRowJsonSerializer.java index 3324a5a1c7b..3dc047e08a7 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racegroup/impl/RaceRowJsonSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racegroup/impl/RaceRowJsonSerializer.java @@ -10,6 +10,11 @@ import com.sap.sailing.server.gateway.serialization.JsonSerializer; public class RaceRowJsonSerializer implements JsonSerializer { public static final String FIELD_FLEET = "fleet"; + + /** + * The race cells in the JSONArray keyed by this name are expected to be written + * in the order in which their race columns appear in the series / leaderboard + */ public static final String FIELD_RACE_CELLS = "races"; private JsonSerializer fleetSerializer; @@ -25,14 +30,12 @@ public class RaceRowJsonSerializer implements JsonSerializer { @Override public JSONObject serialize(RaceRow object) { JSONObject result = new JSONObject(); - result.put(FIELD_FLEET, fleetSerializer.serialize(object.getFleet())); JSONArray cells = new JSONArray(); for (RaceCell cell : object.getCells()) { cells.add(cellSerializer.serialize(cell)); } result.put(FIELD_RACE_CELLS, cells); - return result; } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupFactory.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupFactory.java index 53448156a4a..a64084d23b3 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupFactory.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupFactory.java @@ -80,6 +80,9 @@ public class RaceGroupFactory { return seriesToRaceColumns.keySet(); } + /** + * @param raceColumns must be provided in the same order in which they appear in the series / leaderboard + */ private Collection getRows(Series series, List raceColumns) { Collection rows = new ArrayList<>(); for (Fleet fleet : series.getFleets()) { @@ -94,9 +97,12 @@ public class RaceGroupFactory { return series.isFirstColumnIsNonDiscardableCarryForward(); } - private Collection getCells(String fleetName, List raceColumns, boolean isFirstRaceColumnVirtual) { + /** + * Delivers the race cell in the order of the {@link RaceColumn}s provided in {@code raceColumns}. + */ + private List getCells(String fleetName, List raceColumns, boolean isFirstRaceColumnVirtual) { boolean skippedFirst = false; - Collection cells = new ArrayList<>(); + List cells = new ArrayList<>(); if (raceColumns != null) { int zeroBasedIndexOfRaceInFleet = 0; for (final RaceColumn raceColumn : raceColumns) { @@ -104,7 +110,8 @@ public class RaceGroupFactory { skippedFirst = true; } else { Fleet fleet = raceColumn.getFleetByName(fleetName); - cells.add(new RaceCellImpl(raceColumn.getName(), raceColumn.getRaceLog(fleet), raceColumn.getFactor(), raceColumn.getExplicitFactor(), zeroBasedIndexOfRaceInFleet++)); + cells.add(new RaceCellImpl(raceColumn.getName(), raceColumn.getRaceLog(fleet), + raceColumn.getFactor(), raceColumn.getExplicitFactor(), zeroBasedIndexOfRaceInFleet++)); } } } @@ -113,7 +120,9 @@ public class RaceGroupFactory { /** * Returns a series to race column mapping. If there are no series all race columns will - * be mapped from a default series. + * be mapped from a default series. The race column lists that appear as values in the result + * maintain the order in which the race column objects appear in the original {@link Series} + * or leaderboard. */ private Map> getSeriesToRaceColumns(Leaderboard leaderboard) { Map> seriesToRaceColumns = new HashMap<>(); diff --git a/java/com.sap.sse.common/src/com/sap/sse/common/Util.java b/java/com.sap.sse.common/src/com/sap/sse/common/Util.java index 624d09fbc0b..1756ebf710d 100644 --- a/java/com.sap.sse.common/src/com/sap/sse/common/Util.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/Util.java @@ -253,7 +253,7 @@ public class Util { List l = (List) iterable; return l.get(i); } else { - Iterator iter = iterable.iterator(); + final Iterator iter = iterable.iterator(); T result = iter.next(); for (int j=0; j T first(Iterable iterable) { + final Iterator iter = iterable.iterator(); + final T result; + if (iter.hasNext()) { + result = iter.next(); + } else { + result = null; + } + return result; + } + + public static T last(Iterable iterable) { + final T result; + if (isEmpty(iterable)) { + result = null; + } else { + result = get(iterable, size(iterable)-1); + } + return result; + } /** * A null-safe check whether t is contained in ts. For ts==null the method 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 0c0e17f9492..75c17746e00 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 @@ -16,6 +16,7 @@ import com.sap.sailing.domain.abstractlog.race.SimpleRaceLogIdentifier; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinderResult; import com.sap.sailing.domain.base.CourseArea; import com.sap.sailing.domain.base.EventBase; +import com.sap.sailing.domain.base.racegroup.RaceGroupSeriesFleet; import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.racecommittee.app.AppConstants; @@ -26,7 +27,6 @@ import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager; import com.sap.sailing.racecommittee.app.data.clients.LoadClient; import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderResult; import com.sap.sailing.racecommittee.app.domain.ManagedRace; -import com.sap.sailing.racecommittee.app.domain.impl.RaceGroupSeriesFleet; import com.sap.sailing.racecommittee.app.logging.LogEvent; import com.sap.sailing.racecommittee.app.services.RaceStateService; import com.sap.sailing.racecommittee.app.ui.adapters.racelist.RaceListDataType; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java index aced3420a05..170043f7bb8 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/ManagedRaceListAdapter.java @@ -107,7 +107,7 @@ public class ManagedRaceListAdapter extends ArrayAdapter imple public void notifyDataSetChanged() { super.notifyDataSetChanged(); createViewItemsForRacesAndSeries(); - getFilter().filter(""); + getFilter().refreshRegattaStructures(); } private void createViewItemsForRacesAndSeries() { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceFilter.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceFilter.java index ee7cd72cb42..e32288b65fe 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceFilter.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceFilter.java @@ -18,7 +18,10 @@ import android.widget.Filter; * {@link CurrentRaceFilter}. */ public class RaceFilter extends Filter { - private final CurrentRaceFilter currentRaceFilter = new CurrentRaceFilterImpl(); + /** + * A filter that is updated each time an update for {@link #allRaces} is announced by {@link #refreshRegattaStructures()}. + */ + private CurrentRaceFilter currentRaceFilter; public interface FilterSubscriber { void onResult(List filtered); @@ -28,9 +31,16 @@ public class RaceFilter extends Filter { private final Set allRaces; private FilterMode filterMode; + /** + * @param allRaces + * callers must call {@link #refreshRegattaStructures()} whenever the contents of this set have changed + * @param resultSubscriber + * triggered when the filter results have changed + */ public RaceFilter(Set allRaces, FilterSubscriber resultSubscriber) { this.allRaces = allRaces; this.subscriber = resultSubscriber; + refreshRegattaStructures(); } public void filterByMode(FilterMode filterMode) { @@ -52,7 +62,7 @@ public class RaceFilter extends Filter { result = createResults(allRaces); } else { // filter using the CurrentRaceFilter - result = createResults(currentRaceFilter.filterCurrentRaces(allRaces)); + result = createResults(currentRaceFilter.getCurrentRaces()); } return result; } @@ -64,4 +74,9 @@ public class RaceFilter extends Filter { subscriber.onResult(filterResults); } + public void refreshRegattaStructures() { + this.currentRaceFilter = new CurrentRaceFilterImpl(allRaces); + filter(""); + } + } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListDataTypeRace.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListDataTypeRace.java index aed944c15bd..fd298433d8e 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListDataTypeRace.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/adapters/racelist/RaceListDataTypeRace.java @@ -9,10 +9,10 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import com.sap.sailing.domain.base.racegroup.RaceGroupSeriesFleet; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.racecommittee.app.R; import com.sap.sailing.racecommittee.app.domain.ManagedRace; -import com.sap.sailing.racecommittee.app.domain.impl.RaceGroupSeriesFleet; import com.sap.sse.common.TimePoint; public class RaceListDataTypeRace implements RaceListDataType { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java index 6852bdde769..873205337e9 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/RaceListFragment.java @@ -12,6 +12,7 @@ import com.sap.sailing.android.shared.util.BitmapHelper; import com.sap.sailing.android.shared.util.BroadcastManager; import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; import com.sap.sailing.domain.abstractlog.race.state.impl.BaseRaceStateChangedListener; +import com.sap.sailing.domain.base.racegroup.RaceGroupSeriesFleet; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.R; @@ -19,7 +20,6 @@ import com.sap.sailing.racecommittee.app.RaceApplication; import com.sap.sailing.racecommittee.app.data.DataManager; import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager; import com.sap.sailing.racecommittee.app.domain.ManagedRace; -import com.sap.sailing.racecommittee.app.domain.impl.RaceGroupSeriesFleet; import com.sap.sailing.racecommittee.app.ui.activities.SessionActivity; import com.sap.sailing.racecommittee.app.ui.adapters.racelist.ManagedRaceListAdapter; import com.sap.sailing.racecommittee.app.ui.adapters.racelist.RaceListDataType; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/ProtestTimeDialogFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/ProtestTimeDialogFragment.java index 404a3f92d84..55900bd2398 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/ProtestTimeDialogFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/ProtestTimeDialogFragment.java @@ -27,13 +27,13 @@ import com.sap.sailing.android.shared.util.BroadcastManager; import com.sap.sailing.android.shared.util.ScreenHelper; import com.sap.sailing.android.shared.util.ViewHelper; import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishedTimeFinder; +import com.sap.sailing.domain.base.racegroup.RaceGroupSeriesFleet; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.R; import com.sap.sailing.racecommittee.app.data.DataManager; import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager; import com.sap.sailing.racecommittee.app.domain.ManagedRace; -import com.sap.sailing.racecommittee.app.domain.impl.RaceGroupSeriesFleet; import com.sap.sailing.racecommittee.app.utils.ThemeHelper; import com.sap.sailing.racecommittee.app.utils.TimeUtils; import com.sap.sse.common.TimePoint; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/StartTimeFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/StartTimeFragment.java index fc5a4b69e56..897b5191a65 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/StartTimeFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/StartTimeFragment.java @@ -33,6 +33,7 @@ import com.sap.sailing.domain.abstractlog.race.impl.SimpleRaceLogIdentifierImpl; import com.sap.sailing.domain.abstractlog.race.state.RaceStateChangedListener; import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; import com.sap.sailing.domain.abstractlog.race.state.impl.BaseRaceStateChangedListener; +import com.sap.sailing.domain.base.racegroup.RaceGroupSeriesFleet; import com.sap.sailing.domain.common.LeaderboardNameConstants; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.RacingProcedureType; @@ -42,7 +43,6 @@ import com.sap.sailing.racecommittee.app.R; import com.sap.sailing.racecommittee.app.data.DataStore; import com.sap.sailing.racecommittee.app.data.OnlineDataManager; import com.sap.sailing.racecommittee.app.domain.ManagedRace; -import com.sap.sailing.racecommittee.app.domain.impl.RaceGroupSeriesFleet; import com.sap.sailing.racecommittee.app.ui.adapters.DependentRaceSpinnerAdapter; import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment; import com.sap.sailing.racecommittee.app.utils.ThemeHelper; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/WindFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/WindFragment.java index 3f71c638315..a6fd60c41db 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/WindFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/WindFragment.java @@ -39,6 +39,7 @@ import com.google.android.gms.location.LocationServices; import com.sap.sailing.android.shared.logging.ExLog; import com.sap.sailing.android.shared.util.AppUtils; import com.sap.sailing.android.shared.util.ViewHelper; +import com.sap.sailing.domain.base.racegroup.RaceGroupSeriesFleet; import com.sap.sailing.domain.common.Bearing; import com.sap.sailing.domain.common.Position; import com.sap.sailing.domain.common.SpeedWithBearing; @@ -50,7 +51,6 @@ import com.sap.sailing.domain.common.impl.WindImpl; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.R; import com.sap.sailing.racecommittee.app.domain.ManagedRace; -import com.sap.sailing.racecommittee.app.domain.impl.RaceGroupSeriesFleet; import com.sap.sailing.racecommittee.app.ui.activities.RacingActivity; import com.sap.sailing.racecommittee.app.ui.utils.OnRaceUpdatedListener; import com.sap.sailing.racecommittee.app.ui.views.AccuracyView; diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/RaceHelper.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/RaceHelper.java index 03067c6ec0b..986175e7d79 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/RaceHelper.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/RaceHelper.java @@ -15,12 +15,12 @@ import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateSt import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.SeriesBase; import com.sap.sailing.domain.base.racegroup.RaceGroup; +import com.sap.sailing.domain.base.racegroup.RaceGroupSeriesFleet; import com.sap.sailing.domain.common.LeaderboardNameConstants; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.racecommittee.app.AppPreferences; import com.sap.sailing.racecommittee.app.R; import com.sap.sailing.racecommittee.app.domain.ManagedRace; -import com.sap.sailing.racecommittee.app.domain.impl.RaceGroupSeriesFleet; import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.GateStartTimingFragment; public class RaceHelper {