mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-23 22:19:13 +00:00
# added enum CourseDesignerMode (maps to a specific CourseDesigner)
# added stubs in RaceGroup to enable the configuration of a default RacingProcedureType and CourseDesignerMode per RaceGroup # started to implement correct rendering for "next flag down" view
This commit is contained in:
+7
@@ -0,0 +1,7 @@
|
||||
package com.sap.sailing.domain.base;
|
||||
|
||||
public enum CourseDesignerMode {
|
||||
BY_NAME, // O2, O3, I2,...
|
||||
BY_MAP, // Map-based Course Designer
|
||||
BY_MARKS // ESS
|
||||
}
|
||||
+12
@@ -2,8 +2,10 @@ package com.sap.sailing.domain.base.racegroup;
|
||||
|
||||
import com.sap.sailing.domain.base.BoatClass;
|
||||
import com.sap.sailing.domain.base.CourseArea;
|
||||
import com.sap.sailing.domain.base.CourseDesignerMode;
|
||||
import com.sap.sailing.domain.base.Fleet;
|
||||
import com.sap.sailing.domain.common.Named;
|
||||
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
|
||||
|
||||
/**
|
||||
* A {@link RaceGroup} is an abstract representation of a set of races managed in fleets and series.
|
||||
@@ -40,4 +42,14 @@ public interface RaceGroup extends Named {
|
||||
* Gets the collection of series.
|
||||
*/
|
||||
public Iterable<SeriesWithRows> getSeries();
|
||||
|
||||
/**
|
||||
* Gets the default {@link RacingProcedureType} of this RaceGroup's races.
|
||||
*/
|
||||
public RacingProcedureType getDefaultRacingProcedureType();
|
||||
|
||||
/**
|
||||
* Gets the default {@link CourseDesignerMode} of this RaceGroup's races.
|
||||
*/
|
||||
public CourseDesignerMode getDefaultCourseDesignerMode();
|
||||
}
|
||||
|
||||
+14
@@ -2,9 +2,11 @@ package com.sap.sailing.domain.base.racegroup.impl;
|
||||
|
||||
import com.sap.sailing.domain.base.BoatClass;
|
||||
import com.sap.sailing.domain.base.CourseArea;
|
||||
import com.sap.sailing.domain.base.CourseDesignerMode;
|
||||
import com.sap.sailing.domain.base.racegroup.RaceGroup;
|
||||
import com.sap.sailing.domain.base.racegroup.SeriesWithRows;
|
||||
import com.sap.sailing.domain.common.impl.NamedImpl;
|
||||
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
|
||||
|
||||
|
||||
public class RaceGroupImpl extends NamedImpl implements RaceGroup {
|
||||
@@ -37,4 +39,16 @@ public class RaceGroupImpl extends NamedImpl implements RaceGroup {
|
||||
return boatClass;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RacingProcedureType getDefaultRacingProcedureType() {
|
||||
// TODO Add field and store
|
||||
return RacingProcedureType.GateStart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CourseDesignerMode getDefaultCourseDesignerMode() {
|
||||
// TODO Add field and store
|
||||
return CourseDesignerMode.BY_NAME;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+6
-7
@@ -67,7 +67,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
|
||||
private CourseBase cachedCourseDesign;
|
||||
|
||||
public RaceStateImpl(RaceLog raceLog, RaceLogEventAuthor author, RaceLogEventFactory eventFactory,
|
||||
RacingProcedureType defaultRacingProcedureType) {
|
||||
RacingProcedureType initalRacingProcedureType) {
|
||||
this.raceLog = raceLog;
|
||||
this.author = author;
|
||||
this.factory = eventFactory;
|
||||
@@ -83,7 +83,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
|
||||
this.confirmedFinishPositioningListAnalyzer = new ConfirmedFinishPositioningListFinder(raceLog);
|
||||
this.courseDesignerAnalyzer = new LastPublishedCourseDesignFinder(raceLog);
|
||||
|
||||
this.cachedRacingProcedureType = defaultRacingProcedureType;
|
||||
this.cachedRacingProcedureType = initalRacingProcedureType;
|
||||
this.cachedRaceStatus = RaceLogRaceStatus.UNKNOWN;
|
||||
this.cachedPassId = raceLog.getCurrentPassId();
|
||||
this.cachedIsPositionedCompetitorsConfirmed = false;
|
||||
@@ -106,9 +106,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
|
||||
|
||||
@Override
|
||||
public void setRacingProcedure(TimePoint timePoint, RacingProcedureType newType) {
|
||||
if (racingProcedure == null || !newType.equals(racingProcedureAnalyzer.analyze())) {
|
||||
raceLog.add(factory.createStartProcedureChangedEvent(timePoint, author, raceLog.getCurrentPassId(), newType));
|
||||
}
|
||||
raceLog.add(factory.createStartProcedureChangedEvent(timePoint, author, raceLog.getCurrentPassId(), newType));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -254,7 +252,8 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
|
||||
|
||||
@Override
|
||||
public boolean processStateEvent(RaceStateEvent event) {
|
||||
if (racingProcedure.processStateEvent(event)) {
|
||||
// Always ask the procedure (might be interested in START too)!
|
||||
if (racingProcedure.processStateEvent(event) || event.getEventName() == RaceStateEvents.START) {
|
||||
update();
|
||||
return true;
|
||||
}
|
||||
@@ -329,7 +328,7 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
|
||||
private void recreateRacingProcedure() {
|
||||
if (racingProcedure != null) {
|
||||
removeChangedListener(racingProcedure);
|
||||
racingProcedure.detachFromRaceLog();
|
||||
racingProcedure.detach();
|
||||
}
|
||||
racingProcedure = RacingProcedureFactoryImpl.create(cachedRacingProcedureType, raceLog, author, factory);
|
||||
racingProcedure.setStateEventScheduler(scheduler);
|
||||
|
||||
+15
@@ -1,10 +1,14 @@
|
||||
package com.sap.sailing.domain.racelog.state.racingprocedure;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.common.impl.Util;
|
||||
import com.sap.sailing.domain.common.racelog.FlagPole;
|
||||
import com.sap.sailing.domain.common.racelog.Flags;
|
||||
|
||||
public class FlagPoleState {
|
||||
|
||||
@@ -42,6 +46,17 @@ public class FlagPoleState {
|
||||
public boolean hasNextState() {
|
||||
return hasNextState;
|
||||
}
|
||||
|
||||
public List<FlagPole> computeUpcomingChanges() {
|
||||
if (!hasNextState()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<FlagPole> changes = new ArrayList<FlagPole>();
|
||||
// TODO: compute upcoming changes
|
||||
changes.add(new FlagPole(Flags.NOVEMBER, false));
|
||||
return changes;
|
||||
}
|
||||
|
||||
public static boolean describesSameState(FlagPoleState left, FlagPoleState right) {
|
||||
if (left.hasNextState() != right.hasNextState()) {
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@ package com.sap.sailing.domain.racelog.state.racingprocedure;
|
||||
|
||||
public interface GateStartChangedListener extends RacingProcedureChangedListener {
|
||||
|
||||
void onGateLineOpeningTimeChanged(GateStartRacingProcedure procedure);
|
||||
void onGateLaunchTimeChanged(GateStartRacingProcedure procedure);
|
||||
void onPathfinderChanged(GateStartRacingProcedure procedure);
|
||||
|
||||
}
|
||||
|
||||
+3
-2
@@ -9,9 +9,10 @@ public interface GateStartRacingProcedure extends RacingProcedure {
|
||||
|
||||
void addChangedListener(GateStartChangedListener listener);
|
||||
|
||||
TimePoint getGateLaunchStopTime(TimePoint startTime);
|
||||
TimePoint getGateShutdownTime(TimePoint startTime);
|
||||
Long getGateLineOpeningTime();
|
||||
void setGateLineOpeningTime(TimePoint timePoint, long milliseconds);
|
||||
Long getGateLaunchTime();
|
||||
void setGateLaunchTime(TimePoint timePoint, long milliseconds);
|
||||
|
||||
String getPathfinder();
|
||||
void setPathfinder(TimePoint timePoint, String sailingId);
|
||||
|
||||
+1
-1
@@ -30,6 +30,6 @@ public interface RacingProcedure extends RaceStateEventProcessor, RaceStateChang
|
||||
|
||||
FlagPoleState getActiveFlags(TimePoint startTime, TimePoint now);
|
||||
|
||||
void detachFromRaceLog();
|
||||
void detach();
|
||||
|
||||
}
|
||||
|
||||
+4
-1
@@ -64,8 +64,9 @@ public abstract class BaseRacingProcedure extends BaseRaceStateChangedListener i
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detachFromRaceLog() {
|
||||
public void detach() {
|
||||
raceLog.removeListener(raceLogListener);
|
||||
changedListeners.removeAll();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -196,7 +197,9 @@ public abstract class BaseRacingProcedure extends BaseRaceStateChangedListener i
|
||||
|
||||
@Override
|
||||
public void onStartTimeChanged(RaceState state) {
|
||||
getChangedListeners().onActiveFlagsChanged(this);
|
||||
if (scheduler != null && state.getStartTime() != null) {
|
||||
scheduler.unscheduleAllEvents();
|
||||
scheduler.scheduleStateEvents(createStartStateEvents(state.getStartTime()));
|
||||
}
|
||||
}
|
||||
|
||||
-1
@@ -74,7 +74,6 @@ public class ESSRacingProcedureImpl extends BaseRacingProcedure implements ESSRa
|
||||
case ESS_THREE_UP:
|
||||
case ESS_TWO_UP:
|
||||
case ESS_ONE_UP:
|
||||
case START:
|
||||
getChangedListeners().onActiveFlagsChanged(this);
|
||||
return true;
|
||||
default:
|
||||
|
||||
+2
-2
@@ -7,9 +7,9 @@ public class GateStartChangedListeners extends RacingProcedureChangedListeners<G
|
||||
GateStartChangedListener {
|
||||
|
||||
@Override
|
||||
public void onGateLineOpeningTimeChanged(GateStartRacingProcedure gateStartRacingProcedure) {
|
||||
public void onGateLaunchTimeChanged(GateStartRacingProcedure gateStartRacingProcedure) {
|
||||
for (GateStartChangedListener listener : getListeners()) {
|
||||
listener.onGateLineOpeningTimeChanged(gateStartRacingProcedure);
|
||||
listener.onGateLaunchTimeChanged(gateStartRacingProcedure);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+10
-4
@@ -98,6 +98,7 @@ public class GateStartRacingProcedureImpl extends BaseRacingProcedure implements
|
||||
switch (event.getEventName()) {
|
||||
case START:
|
||||
rescheduleGateShutdownTime(event.getTimePoint());
|
||||
return true;
|
||||
case GATE_CLASS_OVER_GOLF_UP:
|
||||
case GATE_PAPA_UP:
|
||||
case GATE_PAPA_DOWN:
|
||||
@@ -142,19 +143,24 @@ public class GateStartRacingProcedureImpl extends BaseRacingProcedure implements
|
||||
Arrays.asList(new FlagPole(Flags.CLASS, Flags.GOLF, false)));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TimePoint getGateLaunchStopTime(TimePoint startTime) {
|
||||
return startTime.plus(getGateLaunchTime());
|
||||
}
|
||||
|
||||
@Override
|
||||
public TimePoint getGateShutdownTime(TimePoint startTime) {
|
||||
return startTime.plus(startPhaseGolfDownStandardIntervalConstantSummand).plus(getGateLineOpeningTime());
|
||||
return getGateLaunchStopTime(startTime).plus(startPhaseGolfDownStandardIntervalConstantSummand);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getGateLineOpeningTime() {
|
||||
public Long getGateLaunchTime() {
|
||||
return cachedGateLineOpeningTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setGateLineOpeningTime(TimePoint timePoint, long milliseconds) {
|
||||
public void setGateLaunchTime(TimePoint timePoint, long milliseconds) {
|
||||
raceLog.add(factory.createGateLineOpeningTimeEvent(timePoint, author, raceLog.getCurrentPassId(), milliseconds));
|
||||
}
|
||||
|
||||
@@ -188,7 +194,7 @@ public class GateStartRacingProcedureImpl extends BaseRacingProcedure implements
|
||||
Long gateLineOpeningTime = gateLineOpeningTimeAnalyzer.analyze();
|
||||
if (gateLineOpeningTime != null && !gateLineOpeningTime.equals(cachedGateLineOpeningTime)) {
|
||||
cachedGateLineOpeningTime = gateLineOpeningTime;
|
||||
getChangedListeners().onGateLineOpeningTimeChanged(this);
|
||||
getChangedListeners().onGateLaunchTimeChanged(this);
|
||||
}
|
||||
|
||||
String pathfinder = pathfinderAnalyzer.analyze();
|
||||
|
||||
-1
@@ -79,7 +79,6 @@ public class RRS26RacingProcedureImpl extends BaseRacingProcedure implements RRS
|
||||
case RRS26_CLASS_UP:
|
||||
case RRS26_STARTMODE_UP:
|
||||
case RRS26_STARTMODE_DOWN:
|
||||
case START:
|
||||
getChangedListeners().onActiveFlagsChanged(this);
|
||||
return true;
|
||||
default:
|
||||
|
||||
+5
@@ -54,4 +54,9 @@ public class RacingProcedureChangedListeners<T extends RacingProcedureChangedLis
|
||||
}
|
||||
}
|
||||
|
||||
public void removeAll() {
|
||||
allListeners.clear();
|
||||
specificListeners.clear();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<lint>
|
||||
<issue id="NestedWeights">
|
||||
<ignore path="res\layout\results_capturing_view.xml" />
|
||||
<ignore path="res/layout/results_capturing_view.xml" />
|
||||
</issue>
|
||||
<issue id="UselessLeaf">
|
||||
<ignore path="res\layout\results_capturing_view.xml" />
|
||||
<ignore path="res/layout/results_capturing_view.xml" />
|
||||
</issue>
|
||||
</lint>
|
||||
@@ -0,0 +1,67 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="fill_horizontal"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<View
|
||||
android:id="@+id/race_flag_space_splitter"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_centerVertical="true" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_alignBottom="@id/race_flag_space_splitter"
|
||||
android:layout_alignParentTop="true"
|
||||
android:orientation="horizontal" >
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/race_flag_space_up_flags"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_weight="1"
|
||||
android:gravity="top"
|
||||
android:orientation="horizontal" >
|
||||
</LinearLayout>
|
||||
|
||||
<com.sap.sailing.racecommittee.app.ui.views.VerticalTextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="top|right"
|
||||
android:layout_marginBottom="20dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:text="@string/flags_up"
|
||||
android:textAppearance="@style/TextAppearance.Welter.VeryBigTitleLabel" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignTop="@id/race_flag_space_splitter"
|
||||
android:orientation="horizontal" >
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/race_flag_space_down_flags"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_weight="1"
|
||||
android:gravity="bottom"
|
||||
android:orientation="horizontal" >
|
||||
</LinearLayout>
|
||||
|
||||
<com.sap.sailing.racecommittee.app.ui.views.VerticalTextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|right"
|
||||
android:layout_marginBottom="20dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:text="@string/flags_down"
|
||||
android:textAppearance="@style/TextAppearance.Welter.VeryBigTitleLabel" />
|
||||
</LinearLayout>
|
||||
|
||||
</RelativeLayout>
|
||||
@@ -37,67 +37,10 @@
|
||||
android:baselineAligned="false"
|
||||
android:orientation="horizontal" >
|
||||
|
||||
<!-- DISPLAY SECTION -->
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/flagDisplaySpaceLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_weight="0.618"
|
||||
android:gravity="fill_horizontal"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/topFlagsSpace"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:orientation="horizontal" >
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/race_running_base_up_flags"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
</LinearLayout>
|
||||
|
||||
<com.sap.sailing.racecommittee.app.ui.views.VerticalTextView
|
||||
android:id="@+id/flagsUpLabel"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginBottom="20dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:text="@string/flags_up"
|
||||
android:textAppearance="@style/TextAppearance.Welter.VeryBigTitleLabel" />
|
||||
</RelativeLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/downFlagsSpace"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:orientation="horizontal" >
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/race_running_base_down_flags"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
</LinearLayout>
|
||||
|
||||
<com.sap.sailing.racecommittee.app.ui.views.VerticalTextView
|
||||
android:id="@+id/flagsDownLabel"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginBottom="20dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:text="@string/flags_down"
|
||||
android:textAppearance="@style/TextAppearance.Welter.VeryBigTitleLabel" />
|
||||
</RelativeLayout>
|
||||
</RelativeLayout>
|
||||
|
||||
<include layout="@layout/race_flag_space"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_weight="0.618" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="1dp"
|
||||
|
||||
@@ -37,64 +37,10 @@
|
||||
android:baselineAligned="false"
|
||||
android:orientation="horizontal" >
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/flagDisplaySpaceLayout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_weight="0.618"
|
||||
android:gravity="fill_horizontal"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/topFlagsSpace"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:orientation="horizontal" >
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/race_startphase_base_up_flags"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
</LinearLayout>
|
||||
|
||||
<com.sap.sailing.racecommittee.app.ui.views.VerticalTextView
|
||||
android:id="@+id/flagsUpLabel"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginBottom="20dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:text="@string/flags_up"
|
||||
android:textAppearance="@style/TextAppearance.Welter.VeryBigTitleLabel" />
|
||||
</RelativeLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/downFlagsSpace"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:orientation="horizontal" >
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/race_startphase_base_down_flags"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
</LinearLayout>
|
||||
|
||||
<com.sap.sailing.racecommittee.app.ui.views.VerticalTextView
|
||||
android:id="@+id/flagsDownLabel"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginBottom="20dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:text="@string/flags_down"
|
||||
android:textAppearance="@style/TextAppearance.Welter.VeryBigTitleLabel" />
|
||||
</RelativeLayout>
|
||||
</RelativeLayout>
|
||||
<include layout="@layout/race_flag_space"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_weight="0.618" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="1dp"
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
<string name="race_startphase_gate_class_removed">%1$s bis die Klassenflagge eingeholt wird (Rennstart)</string>
|
||||
<string name="race_startphase_gate_papa_display">%1$s bis Flagge Papa angezeigt wird</string>
|
||||
<string name="race_startphase_gate_papa_removed">%1$s bis Flagge Papa eingeholt wird</string>
|
||||
<string name="set_pathfinder">Pathfinder setzen</string>
|
||||
<string name="set_pathfinder">Pathfinder</string>
|
||||
<string name="set_pathfinder_title">Pathfinder setzen</string>
|
||||
<string name="protest_dialog_title">Beginn der Protestzeit setzen</string>
|
||||
<string name="finishing_dialog_title">Erstes Boot im Ziel setzen</string>
|
||||
@@ -117,9 +117,9 @@
|
||||
<string name="lr_course_1">Kurs 1</string>
|
||||
<string name="lr_course_2">Kurs 2</string>
|
||||
<string name="no_pathfinder_selected">Kein Pathfinder gesetzt</string>
|
||||
<string name="set_line_opening_time">Gate-Zeit setzen</string>
|
||||
<string name="no_line_opening_time_selected">keine Zeit gesetzt</string>
|
||||
<string name="set_gate_line_opening_time_title">Gate-Zeit setzen</string>
|
||||
<string name="set_line_opening_time">Gate Launch</string>
|
||||
<string name="no_line_opening_time_selected">Keine Zeit gesetzt</string>
|
||||
<string name="set_gate_line_opening_time_title">Gate Launch Zeit setzen</string>
|
||||
<string name="choose_line_open_min">min</string>
|
||||
<string name="previous_course">Vorherigen Kurs</string>
|
||||
<string name="make_new_course">Kurs erstellen</string>
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
<string name="race_startphase_gate_class_removed">%1$s until Class flag is removed and race starts</string>
|
||||
<string name="race_startphase_gate_papa_display">%1$s until Papa flag is displayed</string>
|
||||
<string name="race_startphase_gate_papa_removed">%1$s until Papa flag is removed</string>
|
||||
<string name="set_pathfinder">Set Pathfinder</string>
|
||||
<string name="set_pathfinder">Pathfinder</string>
|
||||
<string name="set_pathfinder_title">Choose the pathfinder</string>
|
||||
<string name="protest_dialog_title">Set the protest start time</string>
|
||||
<string name="finishing_dialog_title">Set the time when the first finisher crossed the finish line</string>
|
||||
@@ -119,10 +119,10 @@
|
||||
<string name="running_course_selection">Course selection</string>
|
||||
<string name="lr_course_1">Course 1</string>
|
||||
<string name="lr_course_2">Course 2</string>
|
||||
<string name="no_pathfinder_selected">No pathfinder selected</string>
|
||||
<string name="set_line_opening_time">Set gate time</string>
|
||||
<string name="no_pathfinder_selected">No Pathfinder selected</string>
|
||||
<string name="set_line_opening_time">Gate Launch</string>
|
||||
<string name="no_line_opening_time_selected">No time selected</string>
|
||||
<string name="set_gate_line_opening_time_title">Set the gate line opening time</string>
|
||||
<string name="set_gate_line_opening_time_title">Set the Gate Launch time</string>
|
||||
<string name="choose_line_open_min">min</string>
|
||||
<string name="previous_course">Previous course</string>
|
||||
<string name="make_new_course">Create a course</string>
|
||||
@@ -278,4 +278,6 @@
|
||||
<string name="loading_configuration_failed">There was an error loading the configuration.</string>
|
||||
<string name="loading_configuration_succeded">Remote configuration applied.</string>
|
||||
|
||||
<string name="gate_launch_stops_after">Gate Launch stops after %dmin</string>
|
||||
|
||||
</resources>
|
||||
+2
@@ -2,7 +2,9 @@ package com.sap.sailing.racecommittee.app;
|
||||
|
||||
import java.lang.Thread.UncaughtExceptionHandler;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import android.app.Application;
|
||||
import android.content.Context;
|
||||
|
||||
+10
-6
@@ -38,6 +38,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventAuthor;
|
||||
import com.sap.sailing.domain.racelog.RaceLogEventFactory;
|
||||
import com.sap.sailing.domain.racelog.impl.RaceLogEventFactoryImpl;
|
||||
import com.sap.sailing.domain.racelog.impl.RaceLogImpl;
|
||||
import com.sap.sailing.domain.racelog.state.impl.RaceStateImpl;
|
||||
import com.sap.sailing.racecommittee.app.AppPreferences;
|
||||
import com.sap.sailing.racecommittee.app.data.clients.LoadClient;
|
||||
import com.sap.sailing.racecommittee.app.data.loaders.DataLoaderResult;
|
||||
@@ -91,8 +92,9 @@ public class OfflineDataManager extends DataManager {
|
||||
AppPreferences.getAuthor(context),
|
||||
1, RaceLogRaceStatus.FINISHING));
|
||||
|
||||
ManagedRace q1 = new ManagedRaceImpl(context, new ManagedRaceIdentifierImpl("A.B", new FleetImpl("A"), qualifying,
|
||||
raceGroup), RacingProcedureType.ESS, log);
|
||||
ManagedRace q1 = new ManagedRaceImpl(
|
||||
new ManagedRaceIdentifierImpl("A.B", new FleetImpl("A"), qualifying, raceGroup),
|
||||
new RaceStateImpl(log, AppPreferences.getAuthor(context), RaceLogEventFactory.INSTANCE, RacingProcedureType.ESS));
|
||||
|
||||
log = new RaceLogImpl(UUID.randomUUID());
|
||||
/*
|
||||
@@ -100,16 +102,18 @@ public class OfflineDataManager extends DataManager {
|
||||
* new MillisecondsTimePoint(new Date().getTime() + 100000)));
|
||||
*/
|
||||
|
||||
ManagedRace q2 = new ManagedRaceImpl(context, new ManagedRaceIdentifierImpl("B", new FleetImpl("A.A"), qualifying,
|
||||
raceGroup), RacingProcedureType.ESS, log);
|
||||
ManagedRace q2 = new ManagedRaceImpl(
|
||||
new ManagedRaceIdentifierImpl("B", new FleetImpl("A.A"), qualifying, raceGroup),
|
||||
new RaceStateImpl(log, AppPreferences.getAuthor(context), RaceLogEventFactory.INSTANCE, RacingProcedureType.ESS));
|
||||
|
||||
log = new RaceLogImpl(UUID.randomUUID());
|
||||
/*
|
||||
* log.add(factory.createRaceStatusEvent( new MillisecondsTimePoint(new Date()), 5,
|
||||
* RaceLogRaceStatus.FINISHED));
|
||||
*/
|
||||
ManagedRace q3 = new ManagedRaceImpl(context, new ManagedRaceIdentifierImpl("Q3", new FleetImpl("Default"), qualifying,
|
||||
raceGroup), RacingProcedureType.ESS, log);
|
||||
ManagedRace q3 = new ManagedRaceImpl(
|
||||
new ManagedRaceIdentifierImpl("Q3", new FleetImpl("Default"), qualifying, raceGroup),
|
||||
new RaceStateImpl(log, AppPreferences.getAuthor(context), RaceLogEventFactory.INSTANCE, RacingProcedureType.ESS));
|
||||
/*
|
||||
* ManagedRace m1 = new ManagedRaceImpl( new ManagedRaceIdentifierImpl( "M1", new FleetImpl("Default"), medal,
|
||||
* raceGroup), null);
|
||||
|
||||
+11
-3
@@ -18,8 +18,13 @@ import com.sap.sailing.domain.base.racegroup.RaceRow;
|
||||
import com.sap.sailing.domain.base.racegroup.SeriesWithRows;
|
||||
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
|
||||
import com.sap.sailing.domain.racelog.RaceLog;
|
||||
import com.sap.sailing.domain.racelog.RaceLogEventFactory;
|
||||
import com.sap.sailing.domain.racelog.state.RaceState;
|
||||
import com.sap.sailing.domain.racelog.state.impl.RaceStateImpl;
|
||||
import com.sap.sailing.racecommittee.app.AppPreferences;
|
||||
import com.sap.sailing.racecommittee.app.domain.FleetIdentifier;
|
||||
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
|
||||
import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier;
|
||||
import com.sap.sailing.racecommittee.app.domain.impl.FleetIdentifierImpl;
|
||||
import com.sap.sailing.racecommittee.app.domain.impl.ManagedRaceIdentifierImpl;
|
||||
import com.sap.sailing.racecommittee.app.domain.impl.ManagedRaceImpl;
|
||||
@@ -66,9 +71,12 @@ public class ManagedRacesDataParser implements DataParser<Collection<ManagedRace
|
||||
|
||||
private ManagedRace createManagedRace(RaceGroup raceGroup, SeriesBase series, Fleet fleet, String name,
|
||||
RaceLog raceLog) {
|
||||
RacingProcedureType startType = AppPreferences.getDefaultStartProcedureType(context);
|
||||
return new ManagedRaceImpl(context, new ManagedRaceIdentifierImpl(name,
|
||||
new FleetIdentifierImpl(fleet, series, raceGroup)), startType, raceLog);
|
||||
RacingProcedureType startType = raceGroup.getDefaultRacingProcedureType();
|
||||
FleetIdentifier fleetIdentifier = new FleetIdentifierImpl(fleet, series, raceGroup);
|
||||
ManagedRaceIdentifier identifier = new ManagedRaceIdentifierImpl(name, fleetIdentifier);
|
||||
RaceState state = new RaceStateImpl(raceLog, AppPreferences.getAuthor(context),
|
||||
RaceLogEventFactory.INSTANCE, startType);
|
||||
return new ManagedRaceImpl(identifier, state);
|
||||
|
||||
}
|
||||
|
||||
|
||||
-12
@@ -4,20 +4,14 @@ import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.base.CourseBase;
|
||||
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.common.racelog.RaceLogRaceStatus;
|
||||
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
|
||||
import com.sap.sailing.domain.racelog.RaceLog;
|
||||
import com.sap.sailing.domain.racelog.RaceLogEventFactory;
|
||||
import com.sap.sailing.domain.racelog.state.RaceState;
|
||||
import com.sap.sailing.domain.racelog.state.impl.RaceStateImpl;
|
||||
import com.sap.sailing.racecommittee.app.AppPreferences;
|
||||
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
|
||||
import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier;
|
||||
|
||||
@@ -31,12 +25,6 @@ public class ManagedRaceImpl implements ManagedRace {
|
||||
private Collection<Competitor> competitors;
|
||||
private CourseBase courseOnServer;
|
||||
|
||||
public ManagedRaceImpl(Context context, ManagedRaceIdentifier identifier,
|
||||
RacingProcedureType defaultStartProcedureType, RaceLog raceLog) {
|
||||
this(identifier, new RaceStateImpl(raceLog, AppPreferences.getAuthor(context),
|
||||
RaceLogEventFactory.INSTANCE, defaultStartProcedureType));
|
||||
}
|
||||
|
||||
public ManagedRaceImpl(ManagedRaceIdentifier identifier, RaceState state) {
|
||||
this.state = state;
|
||||
this.identifier = identifier;
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ public class SettingsActivity extends PreferenceActivity {
|
||||
|
||||
List<CharSequence> entries = new ArrayList<CharSequence>();
|
||||
List<CharSequence> entryValues = new ArrayList<CharSequence>();
|
||||
for (RacingProcedureType type : RacingProcedureType.values()) {
|
||||
for (RacingProcedureType type : RacingProcedureType.validValues()) {
|
||||
entries.add(type.toString());
|
||||
entryValues.add(type.name());
|
||||
}
|
||||
|
||||
+8
-16
@@ -2,7 +2,6 @@ package com.sap.sailing.racecommittee.app.ui.fragments;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.FragmentManager;
|
||||
import android.app.FragmentTransaction;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
@@ -16,6 +15,7 @@ import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.sap.sailing.domain.base.CourseBase;
|
||||
import com.sap.sailing.domain.base.CourseDesignerMode;
|
||||
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sailing.domain.common.impl.Util;
|
||||
import com.sap.sailing.domain.racelog.analyzing.impl.LastWindFixFinder;
|
||||
@@ -30,9 +30,9 @@ import com.sap.sailing.racecommittee.app.logging.ExLog;
|
||||
import com.sap.sailing.racecommittee.app.ui.activities.WindActivity;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.chooser.RaceInfoFragmentChooser;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.coursedesign.ByLabelCourseDesignDialog;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.RaceInfoListener;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.SetStartTimeRaceFragment;
|
||||
import com.sap.sailing.racecommittee.app.utils.CourseDesignerChooser;
|
||||
|
||||
public class RaceInfoFragment extends RaceFragment implements RaceInfoListener {
|
||||
private final static String TAG = RaceInfoFragment.class.getName();
|
||||
@@ -80,18 +80,12 @@ public class RaceInfoFragment extends RaceFragment implements RaceInfoListener {
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
/*getRace().getRaceLog().add(
|
||||
/* getRace().getRaceLog().add(
|
||||
RaceLogEventFactory.INSTANCE.createStartTimeEvent(
|
||||
MillisecondsTimePoint.now(),
|
||||
new RaceLogEventAuthorImpl("Magic", -1),
|
||||
AppPreferences.getAuthor(getActivity()),
|
||||
getRace().getRaceLog().getCurrentPassId(),
|
||||
MillisecondsTimePoint.now().plus(30000)));
|
||||
RaceLogEventFactory.INSTANCE.createFlagEvent(MillisecondsTimePoint.now(),
|
||||
new RaceLogEventAuthorImpl("Magic", 0),
|
||||
getRace().getRaceLog().getCurrentPassId(),
|
||||
Flags.AP,
|
||||
Flags.NONE,
|
||||
true));*/
|
||||
MillisecondsTimePoint.now().plus(3000000)));*/
|
||||
showCourseDesignDialog();
|
||||
}
|
||||
});
|
||||
@@ -162,12 +156,10 @@ public class RaceInfoFragment extends RaceFragment implements RaceInfoListener {
|
||||
}
|
||||
|
||||
private void showCourseDesignDialog() {
|
||||
FragmentManager fragmentManager = getFragmentManager();
|
||||
|
||||
// TODO: select course designer per race
|
||||
RaceDialogFragment fragment = new ByLabelCourseDesignDialog();
|
||||
CourseDesignerMode mode = getRace().getRaceGroup().getDefaultCourseDesignerMode();
|
||||
RaceDialogFragment fragment = CourseDesignerChooser.choose(getActivity(), mode);
|
||||
fragment.setArguments(getRecentArguments());
|
||||
fragment.show(fragmentManager, "courseDesignDialogFragment");
|
||||
fragment.show(getFragmentManager(), "courseDesignDialogFragment");
|
||||
}
|
||||
|
||||
private void showRaceResetConfirmationDialog() {
|
||||
|
||||
-8
@@ -1,8 +0,0 @@
|
||||
package com.sap.sailing.racecommittee.app.ui.fragments.dialogs;
|
||||
|
||||
public interface GateStartUiListener {
|
||||
|
||||
public void updatePathfinderLabel();
|
||||
public void updateGateLineOpeningTimeLabel();
|
||||
|
||||
}
|
||||
+4
-8
@@ -14,7 +14,7 @@ import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sailing.domain.racelog.state.racingprocedure.GateStartRacingProcedure;
|
||||
import com.sap.sailing.racecommittee.app.R;
|
||||
|
||||
public class RaceChooseGateLineOpeningTimeDialog extends RaceDialogFragment {
|
||||
public class RaceChooseGateLaunchTimeDialog extends RaceDialogFragment {
|
||||
|
||||
public interface GateLineOpeningTimeSelectionListener {
|
||||
public void onLineOpeningTimeSelected();
|
||||
@@ -36,7 +36,7 @@ public class RaceChooseGateLineOpeningTimeDialog extends RaceDialogFragment {
|
||||
|
||||
lineOpeningTimeEditText = (EditText) getView().findViewById(R.id.lineOpeningTimeText);
|
||||
GateStartRacingProcedure procedure = getRaceState().getTypedRacingProcedure();
|
||||
lineOpeningTimeEditText.setText(String.valueOf((procedure.getGateLineOpeningTime() / (60 * 1000))));
|
||||
lineOpeningTimeEditText.setText(String.valueOf((procedure.getGateLaunchTime() / (60 * 1000))));
|
||||
chooseButton = (Button) getDialog().findViewById(R.id.chooseLineOpeningTimeButton);
|
||||
|
||||
chooseButton.setOnClickListener(new OnClickListener() {
|
||||
@@ -48,17 +48,13 @@ public class RaceChooseGateLineOpeningTimeDialog extends RaceDialogFragment {
|
||||
|
||||
protected void onChooseClicked(View view) {
|
||||
try {
|
||||
Long lineOpeningTime = convertToLong(lineOpeningTimeEditText.getText().toString());
|
||||
Long lineOpeningTime = Long.parseLong(lineOpeningTimeEditText.getText().toString());
|
||||
GateStartRacingProcedure procedure = getRace().getState().getTypedRacingProcedure();
|
||||
procedure.setGateLineOpeningTime(MillisecondsTimePoint.now(), Long.valueOf(60 * 1000 * lineOpeningTime));
|
||||
procedure.setGateLaunchTime(MillisecondsTimePoint.now(), Long.valueOf(60 * 1000 * lineOpeningTime));
|
||||
Log.i("RACE_SET_GATELINE_OPENING_TIME", String.valueOf(lineOpeningTime));
|
||||
dismiss();
|
||||
} catch (NumberFormatException nfe) {
|
||||
Toast.makeText(getActivity(), "Please enter a valid number of minutes", Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
protected Long convertToLong(String text) throws NumberFormatException {
|
||||
return Long.parseLong(text);
|
||||
}
|
||||
}
|
||||
-7
@@ -61,7 +61,6 @@ public class RaceFinishedTimeDialog extends RaceDialogFragment {
|
||||
getDialog().setTitle(getText(R.string.finished_dialog_title));
|
||||
Button chooseButton = (Button) view.findViewById(R.id.chooseFinishedTimeButton);
|
||||
chooseButton.setOnClickListener(new OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
setAndAnnounceFinishedTime();
|
||||
@@ -71,10 +70,4 @@ public class RaceFinishedTimeDialog extends RaceDialogFragment {
|
||||
return view;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
|
||||
}
|
||||
}
|
||||
-8
@@ -36,7 +36,6 @@ public class RaceFinishingTimeDialog extends RaceDialogFragment {
|
||||
if (stf.analyze() != null && getRace().getStatus().equals(RaceLogRaceStatus.RUNNING)) {
|
||||
if (stf.analyze().before(finishingTime)) {
|
||||
getRace().getState().setFinishingTime(finishingTime);
|
||||
//getRace().getState().getStartProcedure().setFinishing(finishingTime);
|
||||
dismiss();
|
||||
}else{
|
||||
Toast.makeText(getActivity(), "The selected time is before the race start.", Toast.LENGTH_LONG).show();
|
||||
@@ -62,7 +61,6 @@ public class RaceFinishingTimeDialog extends RaceDialogFragment {
|
||||
getDialog().setTitle(getText(R.string.finished_dialog_title));
|
||||
Button chooseButton = (Button) view.findViewById(R.id.chooseFinishedTimeButton);
|
||||
chooseButton.setOnClickListener(new OnClickListener() {
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
setAndAnnounceFinishedTime();
|
||||
@@ -72,10 +70,4 @@ public class RaceFinishingTimeDialog extends RaceDialogFragment {
|
||||
return view;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -52,7 +52,7 @@ import com.sap.sailing.racecommittee.app.domain.coursedesign.TargetTime;
|
||||
import com.sap.sailing.racecommittee.app.ui.activities.WindActivity;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
|
||||
|
||||
public class ClassicCourseDesignDialog extends RaceDialogFragment {
|
||||
public class ByMapCourseDesignDialog extends RaceDialogFragment {
|
||||
|
||||
private static int WIND_ACTIVITY_REQUEST_CODE = 7331;
|
||||
|
||||
@@ -60,7 +60,7 @@ public class ClassicCourseDesignDialog extends RaceDialogFragment {
|
||||
private GoogleMap courseAreaMap;
|
||||
private Bundle mBundle;
|
||||
@SuppressWarnings("unused")
|
||||
private final static String TAG = ClassicCourseDesignDialog.class.getName();
|
||||
private final static String TAG = ByMapCourseDesignDialog.class.getName();
|
||||
|
||||
private Button publishButton;
|
||||
private Button unpublishButton;
|
||||
@@ -76,7 +76,7 @@ public class ClassicCourseDesignDialog extends RaceDialogFragment {
|
||||
private ArrayAdapter<CourseLayouts> courseLayoutAdapter;
|
||||
private ArrayAdapter<TargetTime> targetTimeAdapter;
|
||||
|
||||
public ClassicCourseDesignDialog() {
|
||||
public ByMapCourseDesignDialog() {
|
||||
super();
|
||||
// handle bug "Dark overlay of MapFragment in Activity with Dialog theme" -
|
||||
// https://code.google.com/p/gmaps-api-issues/issues/detail?id=4865
|
||||
+29
-10
@@ -1,21 +1,27 @@
|
||||
package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo;
|
||||
|
||||
import android.app.Activity;
|
||||
import java.util.List;
|
||||
|
||||
import com.sap.sailing.domain.racelog.state.impl.BaseRaceStateChangedListener;
|
||||
import android.app.Activity;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sailing.domain.common.racelog.FlagPole;
|
||||
import com.sap.sailing.domain.racelog.state.racingprocedure.FlagPoleState;
|
||||
import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure;
|
||||
import com.sap.sailing.domain.racelog.state.racingprocedure.impl.BaseRacingProcedureChangedListener;
|
||||
import com.sap.sailing.racecommittee.app.R;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment;
|
||||
import com.sap.sailing.racecommittee.app.utils.TimeUtils;
|
||||
|
||||
public abstract class BaseRaceInfoRaceFragment<ProcedureType extends RacingProcedure> extends RaceFragment {
|
||||
|
||||
private final ProcedureChangedListener procedureListener;
|
||||
private final StateChangedListener stateListener;
|
||||
protected RaceInfoListener infoListener;
|
||||
|
||||
public BaseRaceInfoRaceFragment() {
|
||||
this.procedureListener = new ProcedureChangedListener();
|
||||
this.stateListener = new StateChangedListener();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -37,13 +43,11 @@ public abstract class BaseRaceInfoRaceFragment<ProcedureType extends RacingProce
|
||||
super.onStart();
|
||||
setupUi();
|
||||
getRacingProcedure().addChangedListener(procedureListener);
|
||||
getRaceState().addChangedListener(stateListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStop() {
|
||||
getRacingProcedure().removeChangedListener(procedureListener);
|
||||
getRaceState().removeChangedListener(stateListener);
|
||||
super.onStop();
|
||||
}
|
||||
|
||||
@@ -52,6 +56,25 @@ public abstract class BaseRaceInfoRaceFragment<ProcedureType extends RacingProce
|
||||
}
|
||||
|
||||
protected abstract void setupUi();
|
||||
|
||||
|
||||
protected boolean setFlagChangesCountdown(TextView targetView) {
|
||||
TimePoint now = MillisecondsTimePoint.now();
|
||||
TimePoint startTime = getRaceState().getStartTime();
|
||||
FlagPoleState flagState = getRaceState().getRacingProcedure().getActiveFlags(startTime, now);
|
||||
List<FlagPole> flagChanges = flagState.computeUpcomingChanges();
|
||||
if (!flagChanges.isEmpty()) {
|
||||
FlagPole changedFlag = flagChanges.get(0);
|
||||
long millisecondsTillChange = TimeUtils.timeUntil(flagState.getNextStateValidFrom());
|
||||
|
||||
int formatTextResourceId = changedFlag.isDisplayed() ? R.string.race_startphase_countdown_mode_display :
|
||||
R.string.race_startphase_countdown_mode_remove;
|
||||
targetView.setText(getString(formatTextResourceId, TimeUtils.formatDuration(millisecondsTillChange),
|
||||
changedFlag.getUpperFlag().toString()));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private class ProcedureChangedListener extends BaseRacingProcedureChangedListener {
|
||||
@Override
|
||||
@@ -59,8 +82,4 @@ public abstract class BaseRaceInfoRaceFragment<ProcedureType extends RacingProce
|
||||
setupUi();
|
||||
}
|
||||
}
|
||||
|
||||
private class StateChangedListener extends BaseRaceStateChangedListener {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+4
-1
@@ -56,8 +56,11 @@ public class FlagPoleStateRenderer {
|
||||
}
|
||||
|
||||
private ImageView createFlagImageView(final Flags upperFlag, final Flags lowerFlag) {
|
||||
LinearLayout.LayoutParams layout = new LinearLayout.LayoutParams(200, 130);
|
||||
layout.setMargins(20, 0, 20, 0);
|
||||
|
||||
ImageView flagView = new ImageView(context);
|
||||
flagView.setLayoutParams(new LinearLayout.LayoutParams(200, 130));
|
||||
flagView.setLayoutParams(layout);
|
||||
flagView.setImageBitmap(getFlagBitmap(upperFlag));
|
||||
flagView.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
|
||||
+5
-5
@@ -26,6 +26,7 @@ import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sailing.domain.common.racelog.Flags;
|
||||
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
|
||||
import com.sap.sailing.racecommittee.app.AppConstants;
|
||||
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.logging.ExLog;
|
||||
@@ -156,12 +157,11 @@ public class SetStartTimeRaceFragment extends RaceFragment {
|
||||
}
|
||||
});
|
||||
|
||||
RacingProcedureType type = RacingProcedureType.ESS;
|
||||
boolean overrideStartProcedureType = PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean(
|
||||
"overrideDefaultStartProcedureType", false);
|
||||
boolean overrideStartProcedureType =
|
||||
PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean("overrideDefaultStartProcedureType", false);
|
||||
RacingProcedureType type = RacingProcedureType.UNKNOWN;
|
||||
if (overrideStartProcedureType) {
|
||||
type = RacingProcedureType.valueOf(PreferenceManager.getDefaultSharedPreferences(getActivity()).getString(
|
||||
"defaultStartProcedureType", RacingProcedureType.ESS.name()));
|
||||
type = AppPreferences.getDefaultStartProcedureType(getActivity());
|
||||
} else {
|
||||
type = getRaceState().getRacingProcedure().getType();
|
||||
}
|
||||
|
||||
+7
-3
@@ -45,9 +45,7 @@ public abstract class BaseFinishingRaceFragment<ProcedureType extends RacingProc
|
||||
finishedButton.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
RaceDialogFragment fragment = new RaceFinishedTimeDialog();
|
||||
fragment.setArguments(getRecentArguments());
|
||||
fragment.show(getFragmentManager(), "dialogFinishedTime");
|
||||
setFinishedTime();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -95,4 +93,10 @@ public abstract class BaseFinishingRaceFragment<ProcedureType extends RacingProc
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
protected void setFinishedTime() {
|
||||
RaceDialogFragment fragment = new RaceFinishedTimeDialog();
|
||||
fragment.setArguments(getRecentArguments());
|
||||
fragment.show(getFragmentManager(), "dialogFinishedTime");
|
||||
}
|
||||
}
|
||||
|
||||
+6
-1
@@ -3,6 +3,7 @@ package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.finishing;
|
||||
import android.os.Bundle;
|
||||
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sailing.domain.racelog.state.racingprocedure.ESSRacingProcedure;
|
||||
import com.sap.sailing.racecommittee.app.R;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.PositioningFragment;
|
||||
@@ -39,5 +40,9 @@ public class ESSFinishingRaceFragment extends BaseFinishingRaceFragment<ESSRacin
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void setFinishedTime() {
|
||||
getRaceState().setFinishedTime(MillisecondsTimePoint.now());
|
||||
}
|
||||
}
|
||||
|
||||
+11
-21
@@ -12,11 +12,11 @@ import android.widget.TextView;
|
||||
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sailing.domain.racelog.state.racingprocedure.FlagPoleState;
|
||||
import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure;
|
||||
import com.sap.sailing.racecommittee.app.R;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.AbortTypeSelectionDialog;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceFinishingTimeDialog;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.BaseRaceInfoRaceFragment;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.FlagPoleStateRenderer;
|
||||
import com.sap.sailing.racecommittee.app.utils.TimeUtils;
|
||||
@@ -84,7 +84,7 @@ public abstract class BaseRunningRaceFragment<ProcedureType extends RacingProced
|
||||
finishingButton.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
getRaceState().setFinishingTime(MillisecondsTimePoint.now());
|
||||
setFinishingTime();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -98,8 +98,8 @@ public abstract class BaseRunningRaceFragment<ProcedureType extends RacingProced
|
||||
});
|
||||
|
||||
flagRenderer = new FlagPoleStateRenderer(getActivity(), getRace(),
|
||||
(LinearLayout) getView().findViewById(R.id.race_running_base_up_flags),
|
||||
(LinearLayout) getView().findViewById(R.id.race_running_base_down_flags));
|
||||
(LinearLayout) getView().findViewById(R.id.race_flag_space_up_flags),
|
||||
(LinearLayout) getView().findViewById(R.id.race_flag_space_down_flags));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -113,23 +113,7 @@ public abstract class BaseRunningRaceFragment<ProcedureType extends RacingProced
|
||||
getString(R.string.race_running_since_template),
|
||||
getRace().getName(), TimeUtils.formatDuration(millisecondsSinceStart)));
|
||||
|
||||
ProcedureType procedure = getRacingProcedure();
|
||||
FlagPoleState flagState = procedure.getActiveFlags(startTime, now);
|
||||
if (flagState.hasNextState()) {
|
||||
// TODO: get changing flag and display on nextCountdownTextView
|
||||
long millisecondsTillChange = flagState.getNextStateValidFrom().minus(now.asMillis()).asMillis();
|
||||
nextCountdownTextView.setText(String.format("%s until next flag...", TimeUtils.formatDuration(millisecondsTillChange)));
|
||||
} else if (procedure.hasIndividualRecall()) {
|
||||
if (procedure.isIndividualRecallDisplayed()) {
|
||||
TimePoint removalAt = procedure.getIndividualRecallRemovalTime();
|
||||
if (removalAt != null) {
|
||||
nextCountdownTextView.setText(String.format("%s until recall ends...",
|
||||
TimeUtils.formatDuration(TimeUtils.timeUntil(removalAt))));
|
||||
}
|
||||
} else {
|
||||
nextCountdownTextView.setText("");
|
||||
}
|
||||
} else {
|
||||
if (!setFlagChangesCountdown(nextCountdownTextView)) {
|
||||
nextCountdownTextView.setText("");
|
||||
}
|
||||
}
|
||||
@@ -148,4 +132,10 @@ public abstract class BaseRunningRaceFragment<ProcedureType extends RacingProced
|
||||
}
|
||||
}
|
||||
|
||||
protected void setFinishingTime() {
|
||||
RaceDialogFragment fragment = new RaceFinishingTimeDialog();
|
||||
fragment.setArguments(getRecentArguments());
|
||||
fragment.show(getFragmentManager(), "dialogFinishingTime");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+7
-1
@@ -1,7 +1,13 @@
|
||||
package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.running;
|
||||
|
||||
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sailing.domain.racelog.state.racingprocedure.ESSRacingProcedure;
|
||||
|
||||
public class ESSRunningRaceFragment extends BaseRunningRaceFragment<ESSRacingProcedure> {
|
||||
|
||||
|
||||
@Override
|
||||
protected void setFinishingTime() {
|
||||
getRaceState().setFinishingTime(MillisecondsTimePoint.now());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+1
-1
@@ -38,7 +38,7 @@ public class GateStartRunningRaceFragment extends BaseRunningRaceFragment<GateSt
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGateLineOpeningTimeChanged(GateStartRacingProcedure gateStartRacingProcedure) {
|
||||
public void onGateLaunchTimeChanged(GateStartRacingProcedure gateStartRacingProcedure) {
|
||||
// not interested - handled by active flags
|
||||
}
|
||||
|
||||
|
||||
+3
-9
@@ -14,7 +14,6 @@ import android.widget.TextView;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sailing.domain.common.racelog.Flags;
|
||||
import com.sap.sailing.domain.racelog.state.racingprocedure.FlagPoleState;
|
||||
import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure;
|
||||
import com.sap.sailing.racecommittee.app.AppConstants;
|
||||
import com.sap.sailing.racecommittee.app.R;
|
||||
@@ -72,8 +71,8 @@ public abstract class BaseStartphaseRaceFragment<ProcedureType extends RacingPro
|
||||
});
|
||||
|
||||
flagRenderer = new FlagPoleStateRenderer(getActivity(), getRace(),
|
||||
(LinearLayout) getView().findViewById(R.id.race_startphase_base_up_flags),
|
||||
(LinearLayout) getView().findViewById(R.id.race_startphase_base_down_flags));
|
||||
(LinearLayout) getView().findViewById(R.id.race_flag_space_up_flags),
|
||||
(LinearLayout) getView().findViewById(R.id.race_flag_space_down_flags));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -86,13 +85,8 @@ public abstract class BaseStartphaseRaceFragment<ProcedureType extends RacingPro
|
||||
startCountdownTextView.setText(String.format(
|
||||
getString(R.string.race_startphase_countdown_start),
|
||||
TimeUtils.formatDuration(millisecondsTillStart), getRace().getName()));
|
||||
setFlagChangesCountdown(nextCountdownTextView);
|
||||
|
||||
FlagPoleState flagState = getRaceState().getRacingProcedure().getActiveFlags(startTime, now);
|
||||
if (flagState.hasNextState()) {
|
||||
// TODO: get changing flag and display on nextCountdownTextView
|
||||
long millisecondsTillChange = flagState.getNextStateValidFrom().minus(now.asMillis()).asMillis();
|
||||
nextCountdownTextView.setText(String.format("%s until next flag...", TimeUtils.formatDuration(millisecondsTillChange)));
|
||||
}
|
||||
}
|
||||
super.notifyTick();
|
||||
}
|
||||
|
||||
+11
-11
@@ -11,7 +11,7 @@ import com.sap.sailing.domain.racelog.state.racingprocedure.GateStartChangedList
|
||||
import com.sap.sailing.domain.racelog.state.racingprocedure.GateStartRacingProcedure;
|
||||
import com.sap.sailing.domain.racelog.state.racingprocedure.impl.BaseRacingProcedureChangedListener;
|
||||
import com.sap.sailing.racecommittee.app.R;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceChooseGateLineOpeningTimeDialog;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceChooseGateLaunchTimeDialog;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceChoosePathFinderDialog;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
|
||||
|
||||
@@ -20,7 +20,7 @@ public class GateStartStartphaseRaceFragment extends BaseStartphaseRaceFragment<
|
||||
private final ChangeListener changeListener;
|
||||
|
||||
private TextView pathfinderTextView;
|
||||
private TextView gateOpeningTimeTextView;
|
||||
private TextView gateLaunchTimeTextView;
|
||||
|
||||
public GateStartStartphaseRaceFragment() {
|
||||
this.changeListener = new ChangeListener();
|
||||
@@ -31,7 +31,7 @@ public class GateStartStartphaseRaceFragment extends BaseStartphaseRaceFragment<
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
|
||||
pathfinderTextView = (TextView) getView().findViewById(R.id.race_startphase_gate_actions_pathfinder_text);
|
||||
gateOpeningTimeTextView = (TextView) getView().findViewById(R.id.race_startphase_gate_actions_opening_text);
|
||||
gateLaunchTimeTextView = (TextView) getView().findViewById(R.id.race_startphase_gate_actions_opening_text);
|
||||
|
||||
Button pathfinderButton = (Button) getView().findViewById(R.id.race_startphase_gate_actions_pathfinder_button);
|
||||
pathfinderButton.setOnClickListener(new OnClickListener() {
|
||||
@@ -45,12 +45,12 @@ public class GateStartStartphaseRaceFragment extends BaseStartphaseRaceFragment<
|
||||
}
|
||||
});
|
||||
|
||||
Button gateTimeButton = (Button) getView().findViewById(R.id.race_startphase_gate_actions_opening_button);
|
||||
gateTimeButton.setOnClickListener(new OnClickListener() {
|
||||
Button gateLaunchTimeButton = (Button) getView().findViewById(R.id.race_startphase_gate_actions_opening_button);
|
||||
gateLaunchTimeButton.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
FragmentManager fragmentManager = getFragmentManager();
|
||||
RaceDialogFragment fragment = new RaceChooseGateLineOpeningTimeDialog();
|
||||
RaceDialogFragment fragment = new RaceChooseGateLaunchTimeDialog();
|
||||
Bundle args = getRecentArguments();
|
||||
fragment.setArguments(args);
|
||||
fragment.show(fragmentManager, null);
|
||||
@@ -87,11 +87,11 @@ public class GateStartStartphaseRaceFragment extends BaseStartphaseRaceFragment<
|
||||
pathfinderTextView.setText(R.string.no_pathfinder_selected);
|
||||
}
|
||||
|
||||
Long gateOpeningTime = procedure.getGateLineOpeningTime();
|
||||
if (gateOpeningTime != null) {
|
||||
gateOpeningTimeTextView.setText(String.format("%d", gateOpeningTime / 1000 / 60));
|
||||
Long gateLaunchTime = procedure.getGateLaunchTime();
|
||||
if (gateLaunchTime != null) {
|
||||
gateLaunchTimeTextView.setText(getString(R.string.gate_launch_stops_after, gateLaunchTime / 1000 / 60));
|
||||
} else {
|
||||
gateOpeningTimeTextView.setText(R.string.no_line_opening_time_selected);
|
||||
gateLaunchTimeTextView.setText(R.string.no_line_opening_time_selected);
|
||||
}
|
||||
super.setupUi();
|
||||
}
|
||||
@@ -99,7 +99,7 @@ public class GateStartStartphaseRaceFragment extends BaseStartphaseRaceFragment<
|
||||
private class ChangeListener extends BaseRacingProcedureChangedListener implements GateStartChangedListener {
|
||||
|
||||
@Override
|
||||
public void onGateLineOpeningTimeChanged(GateStartRacingProcedure gateStartRacingProcedure) {
|
||||
public void onGateLaunchTimeChanged(GateStartRacingProcedure gateStartRacingProcedure) {
|
||||
setupUi();
|
||||
}
|
||||
|
||||
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
package com.sap.sailing.racecommittee.app.utils;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.sap.sailing.domain.base.CourseDesignerMode;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.coursedesign.ByLabelCourseDesignDialog;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.coursedesign.ByMapCourseDesignDialog;
|
||||
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.coursedesign.ESSCourseDesignDialog;
|
||||
|
||||
public class CourseDesignerChooser {
|
||||
|
||||
public static RaceDialogFragment choose(Context context, CourseDesignerMode mode) {
|
||||
// TODO check override in user settings
|
||||
switch (mode) {
|
||||
case BY_MAP:
|
||||
return new ByMapCourseDesignDialog();
|
||||
case BY_MARKS:
|
||||
return new ESSCourseDesignDialog();
|
||||
case BY_NAME:
|
||||
default:
|
||||
return new ByLabelCourseDesignDialog();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -30,7 +30,7 @@ public class DeviceConfigurationHelper {
|
||||
}
|
||||
|
||||
private static void logApply(String configurationName, Object value) {
|
||||
ExLog.i(TAG, String.format("Applied %s configuration: %s", configurationName, value.toString()));
|
||||
ExLog.i(TAG, String.format("Applied '%s' configuration: %s", configurationName, value.toString()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user