# 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:
Lukas Niemeier
2013-11-15 13:46:53 +01:00
parent 1e2c89caf8
commit 9b8890da33
43 changed files with 317 additions and 285 deletions
@@ -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
}
@@ -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();
}
@@ -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;
}
}
@@ -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);
@@ -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()) {
@@ -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);
}
@@ -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);
@@ -30,6 +30,6 @@ public interface RacingProcedure extends RaceStateEventProcessor, RaceStateChang
FlagPoleState getActiveFlags(TimePoint startTime, TimePoint now);
void detachFromRaceLog();
void detach();
}
@@ -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()));
}
}
@@ -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:
@@ -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);
}
}
@@ -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();
@@ -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:
@@ -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,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;
@@ -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);
@@ -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);
}
@@ -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;
@@ -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());
}
@@ -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() {
@@ -1,8 +0,0 @@
package com.sap.sailing.racecommittee.app.ui.fragments.dialogs;
public interface GateStartUiListener {
public void updatePathfinderLabel();
public void updateGateLineOpeningTimeLabel();
}
@@ -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);
}
}
@@ -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);
}
}
@@ -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);
}
}
@@ -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
@@ -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 {
}
}
@@ -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
@@ -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();
}
@@ -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");
}
}
@@ -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());
}
}
@@ -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");
}
}
@@ -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());
}
}
@@ -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
}
@@ -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,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();
}
@@ -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();
}
}
}
@@ -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()));
}
}