removed startprocedure specific code from RaceState.java etc. most things now only rely on the specific StartProcedure. now the start procedures have to be adapted and testet. see also #1140

This commit is contained in:
Fabian Tschirschnitz committed 2013-05-11 17:12:21 +02:00
1 parent 3d1a94571c
commit 0afecb648a
21 files changed
+327 -553

No files matched your search

@@ -55,8 +55,7 @@
<action android:name="com.sap.sailing.racecommittee.app.action.registerRace" />
<action android:name="com.sap.sailing.racecommittee.app.action.clearRaces" />
<action android:name="com.sap.sailing.racecommittee.app.action.alarmAction" />
<action android:name="com.sap.sailing.racecommittee.app.action.automaticRaceEnd" />
<action android:name="com.sap.sailing.racecommittee.app.action.automaticGateClose" />
<action android:name="com.sap.sailing.racecommittee.app.action.startProcedureSpecificAction" />
</intent-filter>
</service>
<service
@@ -8,9 +8,7 @@
<string name="intentActionSendSavedIntents">com.sap.sailing.racecommittee.app.action.sendSavedIntents</string>
<string name="intentActionSendEvent">com.sap.sailing.racecommittee.app.action.sendEvent</string>
<string name="intentActionAlarmAction">com.sap.sailing.racecommittee.app.action.alarmAction</string>
<string name="intentActionIndividualRecallRemoval">com.sap.sailing.racecommittee.app.action.individualrecallremovalaction</string>
<string name="intentActionAutomaticRaceEnd">com.sap.sailing.racecommittee.app.action.automaticRaceEnd</string>
<string name="intentActionAutomaticGateClose">com.sap.sailing.racecommittee.app.action.automaticGateClose</string>
<string name="intenStartProcedureSpecificAction">com.sap.sailing.racecommittee.app.action.startProcedureSpecificAction</string>
<string name="hello">Hello World, RaceCommitteeActivity!</string>
<string name="running_on_course">(on course %s)</string>
@@ -17,6 +17,7 @@ public class AppConstants {
public final static String RACE_ID_KEY = "raceUuid";
public final static String SERVICE_UNIQUE_ID = "serviceUID";
public final static String RACING_EVENT_TIME = "racingEventTime";
public final static String STARTPROCEDURE_SPECIFIC_EVENT_ID = "startProcedureSpecificEventId";
public final static String EXTRAS_SERIALIZED_EVENT = "json";
public final static String EXTRAS_URL = "url";
public final static String FLAG_KEY = "raceFlag";
@@ -26,7 +26,9 @@ public interface StartProcedure {
void dispatchFiredEventTimePoint(TimePoint startTime, TimePoint eventTime);
void setChangeListener(StartProcedureListener listener);
void setStartProcedureListener(StartProcedureListener listener);
void setRunningRaceEventListener(RunningRaceEventListener listener);
void setFinishing(TimePoint eventTime);
@@ -40,12 +42,6 @@ public interface StartProcedure {
void setGeneralRecall(TimePoint eventTime);
void setIndividualRecall(TimePoint eventTime);
void dispatchFiredIndividualRecallRemovalEvent(TimePoint individualRecallDisplayedTime, TimePoint eventTime);
void setIndividualRecallRemoval(TimePoint eventTime);
Class<? extends RaceFragment> getStartphaseFragment();
Class<? extends RaceFragment> getRunningRaceFragment();
@@ -54,8 +50,6 @@ public interface StartProcedure {
Pair<String, Long> getNextFlagCountdownUiLabel(Context context, long millisecondsTillStart);
void dispatchAutomaticGateClose(TimePoint eventTime);
void setRunningRaceEventListener(RunningRaceEventListener listener);
void handleStartProcedureSpecificEvent(TimePoint eventTime, Integer eventId);
}
@@ -9,13 +9,11 @@ public interface StartProcedureListener {
void onRaceStarted(TimePoint eventTime);
void onRaceFinishing(TimePoint now);
void onRaceFinishing(TimePoint eventTime);
void onRaceFinishing(TimePoint now, TimePoint automaticRaceEnd);
void onRaceFinishing(TimePoint eventTime, TimePoint automaticRaceEnd);
void onRaceFinished(TimePoint now);
void onRaceFinished(TimePoint eventTime);
void onIndividualRecall(TimePoint eventTime);
void onIndividualRecallRemoval();
void onStartProcedureSpecificEvent(TimePoint eventTime, Integer eventId);
}
@@ -0,0 +1,10 @@
package com.sap.sailing.racecommittee.app.domain.startprocedure.impl;
import com.sap.sailing.racecommittee.app.domain.startprocedure.RunningRaceEventListener;
public interface EssRunningRaceEventListener extends RunningRaceEventListener{
void onIndividualRecall();
void onIndividualRecallRemoval();
}
@@ -24,7 +24,7 @@ import com.sap.sailing.racecommittee.app.domain.startprocedure.StartPhaseEventLi
import com.sap.sailing.racecommittee.app.domain.startprocedure.StartProcedure;
import com.sap.sailing.racecommittee.app.domain.startprocedure.StartProcedureListener;
import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.RunningRaceFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.EssRunningRaceFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.startphase.EssStartPhaseFragment;
public class ExtremeSailingSeriesStartProcedure implements StartProcedure {
@@ -39,16 +39,21 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure {
private final static double essAutomaticRaceFinishMultiplyer = 0.75;
//list of start procedure specific event id's
private static final Integer INDIVIDUAL_RECALL_REMOVAL_EVENT_ID = 1;
private List<Long> startProcedureEventIntervals;
private PassAwareRaceLog raceLog;
private StartProcedureListener raceStateChangedListener;
private EssStartPhaseEventListener startPhaseEventListener;
private EssRunningRaceEventListener runningRaceEventListener;
public ExtremeSailingSeriesStartProcedure(PassAwareRaceLog raceLog) {
this.raceLog = raceLog;
startProcedureEventIntervals = new ArrayList<Long>();
raceStateChangedListener = null;
startPhaseEventListener = null;
runningRaceEventListener = null;
startProcedureEventIntervals.add(startPhaseAPDownInterval);
startProcedureEventIntervals.add(startPhaseESSThreeUpInterval);
@@ -155,7 +160,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure {
}
@Override
public void setChangeListener(StartProcedureListener raceStateChangedListener) {
public void setStartProcedureListener(StartProcedureListener raceStateChangedListener) {
this.raceStateChangedListener = raceStateChangedListener;
}
@@ -267,7 +272,6 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure {
}
}
@Override
public void setIndividualRecall(TimePoint eventTime) {
RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.<Competitor>emptyList(),
raceLog.getCurrentPassId(), Flags.XRAY, Flags.NONE, /*isDisplayed*/true);
@@ -275,12 +279,16 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure {
TimePoint individualRecallRemovalFireTimePoint = eventTime.plus(individualRecallRemovalInterval);
if (runningRaceEventListener != null) {
runningRaceEventListener.onIndividualRecall();
}
if (raceStateChangedListener != null) {
raceStateChangedListener.onIndividualRecall(individualRecallRemovalFireTimePoint);
raceStateChangedListener.onStartProcedureSpecificEvent(individualRecallRemovalFireTimePoint, INDIVIDUAL_RECALL_REMOVAL_EVENT_ID);
}
}
@Override
public void dispatchFiredIndividualRecallRemovalEvent(TimePoint individualRecallDisplayedTime, TimePoint eventTime) {
if (individualRecallDisplayedTime != null) {
long interval = eventTime.asMillis() - individualRecallDisplayedTime.asMillis();
@@ -291,16 +299,20 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure {
}
}
@Override
public void setIndividualRecallRemoval(TimePoint eventTime) {
RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.<Competitor>emptyList(),
raceLog.getCurrentPassId(), Flags.XRAY, Flags.NONE, /*isDisplayed*/false);
raceLog.add(event);
if (raceStateChangedListener != null) {
raceStateChangedListener.onIndividualRecallRemoval();
if (runningRaceEventListener != null) {
runningRaceEventListener.onIndividualRecallRemoval();
}
}
public Object getIndividualRecallDisplayedTime() {
// TODO Auto-generated method stub
return null;
}
@Override
public Class<? extends RaceFragment> getStartphaseFragment() {
@@ -309,7 +321,7 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure {
@Override
public Class<? extends RaceFragment> getRunningRaceFragment() {
return RunningRaceFragment.class;
return EssRunningRaceFragment.class;
}
@Override
@@ -335,15 +347,14 @@ public class ExtremeSailingSeriesStartProcedure implements StartProcedure {
}
@Override
public void dispatchAutomaticGateClose(TimePoint eventTime) {
// TODO Auto-generated method stub
public void setRunningRaceEventListener(RunningRaceEventListener listener) {
this.runningRaceEventListener = (EssRunningRaceEventListener) listener;
}
@Override
public void setRunningRaceEventListener(RunningRaceEventListener listener) {
public void handleStartProcedureSpecificEvent(TimePoint eventTime, Integer eventId) {
// TODO Auto-generated method stub
}
}
@@ -133,7 +133,7 @@ public class GateStartProcedure implements StartProcedure {
}
@Override
public void setChangeListener(StartProcedureListener raceStateChangedListener) {
public void setStartProcedureListener(StartProcedureListener raceStateChangedListener) {
this.raceStateChangedListener = raceStateChangedListener;
}
@@ -237,11 +237,6 @@ public class GateStartProcedure implements StartProcedure {
}
}
@Override
public void setIndividualRecallRemoval(TimePoint eventTime) {
}
@Override
public Class<? extends RaceFragment> getStartphaseFragment() {
return GateStartPhaseFragment.class;
@@ -277,17 +272,6 @@ public class GateStartProcedure implements StartProcedure {
return result;
}
@Override
public void setIndividualRecall(TimePoint eventTime) {
}
@Override
public void dispatchFiredIndividualRecallRemovalEvent(TimePoint individualRecallDisplayedTime, TimePoint eventTime) {
}
@Override
public void dispatchAutomaticGateClose(TimePoint eventTime) {
RaceLogEvent event = RaceLogEventFactory.INSTANCE.createFlagEvent(eventTime, UUID.randomUUID(), Collections.<Competitor>emptyList(),
raceLog.getCurrentPassId(), Flags.GOLF, Flags.NONE, /*isDisplayed*/false);
@@ -297,5 +281,29 @@ public class GateStartProcedure implements StartProcedure {
runningRaceEventListener.onGolfDown();
}
}
public void setGateLineOpeningTime(Long gateLineOpeningTimeInMinutes){
//TODO
}
public void setPathfinder(String sailingId){
//TODO
}
@Override
public void handleStartProcedureSpecificEvent(TimePoint eventTime, Integer eventId) {
// TODO Auto-generated method stub
}
public String getPathfinder() {
// TODO Auto-generated method stub
return null;
}
public Long getGateLineOpeningTime() {
// TODO Auto-generated method stub
return null;
}
}
@@ -121,31 +121,4 @@ public interface RaceState extends StartProcedureListener {
*/
RaceLogRaceStatus getStatus();
/**
* @return the timepoint at which the individual recall was displayed or null when the individual recall is already removed
*/
TimePoint getIndividualRecallDisplayedTime();
/**
* @return the current pathfinder boat if it is a gate start race
*/
String getPathfinder();
/**
* Set the current pathfinder boat if it is a gate start race
* @param sailingId
*/
void setPathfinder(String sailingId);
/**
* @return the current pathfinder boat if it is a gate start race
*/
Long getGateLineOpeningTime();
/**
* Set the current pathfinder boat if it is a gate start race
* @param sailingId
*/
void setGateLineOpeningTime(Long gateLineOpeningTimeInMillis);
}
@@ -8,17 +8,4 @@ public interface RaceStateChangedListener {
void onStartTimeChanged(TimePoint startTime);
void onRaceAborted();
void onIndividualRecallDisplayed(TimePoint individualRecallRemovalFireTimePoint);
void onIndividualRecallRemoval();
void onAutomaticRaceEnd(TimePoint automaticRaceEnd);
void onPathfinderSelected();
void onGateLineOpeningTimeChanged();
void onGateLineOpeningTimeTrigger(TimePoint gateCloseTimePoint);
}
@@ -22,17 +22,13 @@ import com.sap.sailing.domain.racelog.RaceLogEventFactory;
import com.sap.sailing.domain.racelog.analyzing.impl.FinishPositioningListFinder;
import com.sap.sailing.domain.racelog.analyzing.impl.FinishedTimeFinder;
import com.sap.sailing.domain.racelog.analyzing.impl.FinishingTimeFinder;
import com.sap.sailing.domain.racelog.analyzing.impl.GateLineOpeningTimeFinder;
import com.sap.sailing.domain.racelog.analyzing.impl.IndividualRecallFinder;
import com.sap.sailing.domain.racelog.analyzing.impl.LastPublishedCourseDesignFinder;
import com.sap.sailing.domain.racelog.analyzing.impl.PathfinderFinder;
import com.sap.sailing.domain.racelog.analyzing.impl.RaceStatusAnalyzer;
import com.sap.sailing.domain.racelog.analyzing.impl.StartProcedureTypeAnalyzer;
import com.sap.sailing.domain.racelog.analyzing.impl.StartTimeFinder;
import com.sap.sailing.racecommittee.app.domain.racelog.RaceLogChangedListener;
import com.sap.sailing.racecommittee.app.domain.racelog.impl.RaceLogChangedVisitor;
import com.sap.sailing.racecommittee.app.domain.startprocedure.StartProcedure;
import com.sap.sailing.racecommittee.app.domain.startprocedure.impl.GateStartProcedure;
import com.sap.sailing.racecommittee.app.domain.startprocedure.impl.StartProcedureFactory;
import com.sap.sailing.racecommittee.app.domain.state.RaceState;
import com.sap.sailing.racecommittee.app.domain.state.RaceStateChangedListener;
@@ -56,9 +52,6 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
private FinishingTimeFinder finishingTimeFinder;
private LastPublishedCourseDesignFinder lastCourseDesignFinder;
private FinishPositioningListFinder finishPositioningListFinder;
private IndividualRecallFinder individualRecallFinder;
private PathfinderFinder pathfinderFinder;
private GateLineOpeningTimeFinder gateLineOpeningTimeFinder;
private StartProcedureTypeAnalyzer startProcedureTypeAnalyzer;
public RaceStateImpl(StartProcedureType defaultStartProcedureType, PassAwareRaceLog raceLog) {
@@ -77,9 +70,6 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
this.statusAnalyzer = new RaceStatusAnalyzer(raceLog);
this.lastCourseDesignFinder = new LastPublishedCourseDesignFinder(raceLog);
this.finishPositioningListFinder = new FinishPositioningListFinder(raceLog);
this.individualRecallFinder = new IndividualRecallFinder(raceLog);
this.pathfinderFinder = new PathfinderFinder(raceLog);
this.gateLineOpeningTimeFinder = new GateLineOpeningTimeFinder(raceLog);
this.startProcedureTypeAnalyzer = new StartProcedureTypeAnalyzer(raceLog);
registerStartProcedure();
@@ -109,11 +99,11 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
private void registerStartProcedure() {
if (startProcedure != null) {
startProcedure.setChangeListener(null);
startProcedure.setStartProcedureListener(null);
}
StartProcedureType type = getStartProcedureType();
startProcedure = StartProcedureFactory.create(type, raceLog);
startProcedure.setChangeListener(this);
startProcedure.setStartProcedureListener(this);
}
private void setStatus(RaceLogRaceStatus newStatus) {
@@ -221,9 +211,6 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
public void onRaceStarted(TimePoint eventTime) {
RaceLogEvent statusEvent = RaceLogEventFactory.INSTANCE.createRaceStatusEvent(eventTime, raceLog.getCurrentPassId(), RaceLogRaceStatus.RUNNING);
this.raceLog.add(statusEvent);
if(getGateLineOpeningTime()!=null){
notifyListenersAboutGateLineOpeningTimeTrigger();
}
}
@Override
@@ -235,15 +222,8 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
@Override
public void onRaceFinishing(TimePoint eventTime, TimePoint automaticRaceEnd) {
onRaceFinishing(eventTime);
notifyListenersAboutAutomaticRaceEnd(automaticRaceEnd);
}
private void notifyListenersAboutAutomaticRaceEnd(TimePoint automaticRaceEnd) {
for (RaceStateChangedListener listener : stateChangedListeners) {
listener.onAutomaticRaceEnd(automaticRaceEnd);
}
}
@Override
public void onRaceFinished(TimePoint eventTime) {
@@ -287,91 +267,8 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener {
}
@Override
public void onIndividualRecall(TimePoint individualRecallRemovalFireTimePoint) {
notifyListenersAboutIndividualRecall(individualRecallRemovalFireTimePoint);
}
private void notifyListenersAboutIndividualRecall(TimePoint individualRecallRemovalFireTimePoint) {
for (RaceStateChangedListener listener : stateChangedListeners) {
listener.onIndividualRecallDisplayed(individualRecallRemovalFireTimePoint);
}
}
@Override
public TimePoint getIndividualRecallDisplayedTime() {
return individualRecallFinder.getIndividualRecallDisplayedTime();
}
@Override
public void onIndividualRecallRemoval() {
notifyListenersAboutIndividualRecallRemoval();
}
private void notifyListenersAboutIndividualRecallRemoval() {
for (RaceStateChangedListener listener : stateChangedListeners) {
listener.onIndividualRecallRemoval();
}
}
@Override
public String getPathfinder() {
return pathfinderFinder.getPathfinderId();
}
@Override
public void setPathfinder(String sailingId) {
TimePoint eventTime = MillisecondsTimePoint.now();
RaceLogEvent event = RaceLogEventFactory.INSTANCE.createPathfinderEvent(eventTime, raceLog.getCurrentPassId(),
sailingId);
public void onStartProcedureSpecificEvent(TimePoint eventTime, Integer eventId) {
// TODO Auto-generated method stub
this.raceLog.add(event);
notifyListenersAboutPathFinderChange();
}
private void notifyListenersAboutPathFinderChange() {
for (RaceStateChangedListener listener : stateChangedListeners) {
listener.onPathfinderSelected();
}
}
@Override
public Long getGateLineOpeningTime() {
return gateLineOpeningTimeFinder.getGateLineOpeningTime();
}
@Override
public void setGateLineOpeningTime(Long gateLineOpeningTimeInMillis) {
TimePoint eventTime = MillisecondsTimePoint.now();
RaceLogEvent event = RaceLogEventFactory.INSTANCE.createGateLineOpeningTimeEvent(eventTime, raceLog.getCurrentPassId(),
gateLineOpeningTimeInMillis);
this.raceLog.add(event);
notifyListenersAboutGateLineOpeningTimeChanged();
if(eventTime.after(getStartTime()) && getStatus().equals(RaceLogRaceStatus.RUNNING)){
notifyListenersAboutGateLineOpeningTimeTrigger();
}
}
private void notifyListenersAboutGateLineOpeningTimeChanged() {
for (RaceStateChangedListener listener : stateChangedListeners) {
listener.onGateLineOpeningTimeChanged();
}
}
private void notifyListenersAboutGateLineOpeningTimeTrigger() {
for (RaceStateChangedListener listener : stateChangedListeners) {
Long gateLineOpeningTime = GateStartProcedure.startPhaseGolfDownStandardInterval;
//this should not happen
if(this.getGateLineOpeningTime()!=null){
gateLineOpeningTime = this.getGateLineOpeningTime();
}
listener.onGateLineOpeningTimeTrigger(this.getStartTime().plus(GateStartProcedure.startPhaseGolfDownStandardIntervalConstantSummand+gateLineOpeningTime));
}
}
}
@@ -30,34 +30,4 @@ public class RaceStateListener implements RaceStateChangedListener {
public void onRaceAborted() {
service.handleRaceAborted(race);
}
@Override
public void onIndividualRecallDisplayed(TimePoint individualRecallRemovalFireTimePoint) {
service.handleIndividualRecall(race, individualRecallRemovalFireTimePoint);
}
@Override
public void onIndividualRecallRemoval() {
service.handleIndividualRecallRemoved(race);
}
@Override
public void onAutomaticRaceEnd(TimePoint automaticRaceEnd) {
service.handleAutomaticRaceEnd(race, automaticRaceEnd);
}
@Override
public void onPathfinderSelected() {
// do nothing
}
@Override
public void onGateLineOpeningTimeChanged() {
// do nothing
}
@Override
public void onGateLineOpeningTimeTrigger(TimePoint gateCloseTimePoint) {
service.handleGateLineOpeningTimeChanged(race, gateCloseTimePoint);
}
}
@@ -180,12 +180,9 @@ public class RaceStateService extends Service {
}
managedIntents.get(race.getId()).remove(intent);
return;
} else if (getString(R.string.intentActionIndividualRecallRemoval).equals(action)) {
race.getState().getStartProcedure().dispatchFiredIndividualRecallRemovalEvent(race.getState().getIndividualRecallDisplayedTime(), eventTime);
} else if (getString(R.string.intentActionAutomaticRaceEnd).equals(action)) {
race.getState().getStartProcedure().dispatchAutomaticRaceEndEvent(eventTime);
} else if (getString(R.string.intentActionAutomaticGateClose).equals(action)) {
race.getState().getStartProcedure().dispatchAutomaticGateClose(eventTime);
} else if (getString(R.string.intenStartProcedureSpecificAction).equals(action)) {
Integer eventId =intent.getExtras().getInt(AppConstants.STARTPROCEDURE_SPECIFIC_EVENT_ID);
race.getState().getStartProcedure().handleStartProcedureSpecificEvent(eventTime, eventId);
}
}
@@ -315,23 +312,7 @@ public class RaceStateService extends Service {
clearAlarms(race.getId());
}
public void handleIndividualRecall(ManagedRace race, TimePoint individualRecallRemovalFireTimePoint) {
String action = getString(R.string.intentActionIndividualRecallRemoval);
scheduleEventTime(action, race, individualRecallRemovalFireTimePoint);
public void handleStartProcedureSpecificEvent(ManagedRace race, TimePoint startProcedureSpecificEventTimePoint, Integer eventId) {
String action = getString(R.string.intenStartProcedureSpecificAction);
}
public void handleIndividualRecallRemoved(ManagedRace race) {
clearAlarms(race.getId());
}
public void handleAutomaticRaceEnd(ManagedRace race, TimePoint automaticRaceEnd) {
String action = getString(R.string.intentActionAutomaticRaceEnd);
scheduleEventTime(action, race, automaticRaceEnd);
}
public void handleGateLineOpeningTimeChanged(ManagedRace race, TimePoint gateCloseTimePoint) {
String action = getString(R.string.intentActionAutomaticGateClose);
scheduleEventTime(action, race, gateCloseTimePoint);
}
}
@@ -24,8 +24,6 @@ import com.sap.sailing.racecommittee.app.domain.state.RaceStateChangedListener;
import com.sap.sailing.racecommittee.app.logging.ExLog;
import com.sap.sailing.racecommittee.app.ui.fragments.chooser.RaceInfoFragmentChooser;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.CourseDesignDialogFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.IndividualRecallUiListener;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.GateStartUiListener;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.RaceInfoListener;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.SetStartTimeRaceFragment;
@@ -168,13 +166,6 @@ public class RaceInfoFragment extends RaceFragment implements RaceStateChangedLi
//do nothing (onRaceStateChanged(RaceState) handles state change and fragment switch already
}
@Override
public void onIndividualRecallDisplayed(TimePoint individualRecallRemovalFireTimePoint) {
if (infoFragment instanceof IndividualRecallUiListener) {
((IndividualRecallUiListener) infoFragment).displayIndividualRecallFlag();
}
}
private void showRaceResetConfirmationDialog() {
prepareResetRaceView();
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
@@ -233,37 +224,4 @@ public class RaceInfoFragment extends RaceFragment implements RaceStateChangedLi
//do nothing
}
@Override
public void onIndividualRecallRemoval() {
if (infoFragment instanceof IndividualRecallUiListener) {
((IndividualRecallUiListener) infoFragment).removeIndividualRecallFlag();
}
}
@Override
public void onAutomaticRaceEnd(TimePoint automaticRaceEnd) {
// TODO Auto-generated method stub
}
@Override
public void onPathfinderSelected() {
if (infoFragment instanceof GateStartUiListener) {
((GateStartUiListener) infoFragment).updatePathfinderLabel();
}
}
@Override
public void onGateLineOpeningTimeChanged() {
if (infoFragment instanceof GateStartUiListener) {
((GateStartUiListener) infoFragment).updateGateLineOpeningTimeLabel();
}
}
@Override
public void onGateLineOpeningTimeTrigger(TimePoint gateCloseTimePoint) {
// TODO Auto-generated method stub
}
}
@@ -1,9 +0,0 @@
package com.sap.sailing.racecommittee.app.ui.fragments.dialogs;
public interface IndividualRecallUiListener {
public void displayIndividualRecallFlag();
public void removeIndividualRecallFlag();
}
@@ -53,7 +53,9 @@ public class RaceChooseLineOpeningTimeDialog extends RaceDialogFragment {
protected void onChooseClicked(View view) {
try{
Integer lineOpeningTime = convertToInteger(lineOpeningTimeEditText.getText().toString());
this.getRace().getState().setGateLineOpeningTime(Long.valueOf(60 * 1000 * lineOpeningTime));
if(getRace().getState().getStartProcedure() instanceof GateStartProcedure){
((GateStartProcedure) getRace().getState().getStartProcedure()).setGateLineOpeningTime(Long.valueOf(60 * 1000 * lineOpeningTime));
}
Log.i("RACE_SET_GATELINE_OPENING_TIME", String.valueOf(lineOpeningTime));
dismiss();
} catch(NumberFormatException nfe){
@@ -13,6 +13,7 @@ import android.widget.Button;
import android.widget.EditText;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.domain.startprocedure.impl.GateStartProcedure;
public class RaceChoosePathFinderDialog extends RaceDialogFragment {
@@ -73,7 +74,9 @@ public class RaceChoosePathFinderDialog extends RaceDialogFragment {
protected void onChooseClicked(View view) {
String sailingId = sailingNationalityEditText.getText().toString() + " " + sailingNumberEditText.getText().toString();
this.getRace().getState().setPathfinder(sailingId);
if(getRace().getState().getStartProcedure() instanceof GateStartProcedure){
((GateStartProcedure) getRace().getState().getStartProcedure()).setPathfinder(sailingId);
}
Log.i("RACE_SET_PATHFINDER", sailingId);
dismiss();
}
@@ -229,38 +229,6 @@ public class ManagedRaceListFragment extends ListFragment implements JuryFlagCli
notifyDataChanged();
}
@Override
public void onIndividualRecallDisplayed(TimePoint individualRecallRemovalFireTimePoint) {
notifyDataChanged();
}
@Override
public void onIndividualRecallRemoval() {
notifyDataChanged();
}
@Override
public void onAutomaticRaceEnd(TimePoint automaticRaceEnd) {
notifyDataChanged();
}
@Override
public void onPathfinderSelected() {
// do nothing
}
@Override
public void onGateLineOpeningTimeChanged() {
notifyDataChanged();
}
@Override
public void onGateLineOpeningTimeTrigger(TimePoint gateCloseTimePoint) {
// do nothing
}
/*
*
* public void notifyDataChanged() { List<RaceListDataType> list = adapter.getItems(); for (int i = 0; i <
@@ -1,202 +1,208 @@
package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo;
import android.app.AlertDialog;
import android.app.FragmentManager;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView;
import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.logging.ExLog;
import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.AbortTypeSelectionDialog;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.IndividualRecallUiListener;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
public class RunningRaceFragment extends RaceFragment implements IndividualRecallUiListener {
private TextView countUpTextView;
private ImageView individualRecallFlag;
private TextView individualRecallLabel;
ImageButton abortingFlagButton;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.race_running_view, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
countUpTextView = (TextView) getView().findViewById(R.id.raceCountUp);
individualRecallFlag = (ImageView) getView().findViewById(R.id.xrayFlag);
individualRecallLabel = (TextView) getView().findViewById(R.id.individualRecallLabel);
ImageButton blueFlagButton = (ImageButton) getView().findViewById(R.id.blueFlagButton);
blueFlagButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showDisplayBlueFlagDialog();
}
});
abortingFlagButton = (ImageButton) getView().findViewById(R.id.abortingFlagButton);
abortingFlagButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showChooseAPNovemberDialog();
}
});
ImageButton generalRecallFlagButton = (ImageButton) getView().findViewById(R.id.firstSubstituteButton);
generalRecallFlagButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showDisplayGeneralRecallDialog();
}
});
ImageButton individualRecallButton = (ImageButton) getView().findViewById(R.id.individualRecallButton);
individualRecallButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
TimePoint now = MillisecondsTimePoint.now();
if (getRace().getState().getIndividualRecallDisplayedTime() == null) {
getRace().getState().getStartProcedure().setIndividualRecall(now);
} else {
getRace().getState().getStartProcedure().setIndividualRecallRemoval(now);
}
}
});
}
private void showDisplayGeneralRecallDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(getActivity().getResources().getString(R.string.confirmation_first_substitute_display))
.setCancelable(true)
.setPositiveButton(getActivity().getResources().getString(R.string.yes), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ExLog.i(ExLog.RACE_RUNNING_GENERAL_RECALL_YES, getRace().getId().toString(), getActivity());
getRace().getState().getStartProcedure().setGeneralRecall(MillisecondsTimePoint.now());
}
})
.setNegativeButton(getActivity().getResources().getString(R.string.no), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ExLog.i(ExLog.RACE_RUNNING_GENERAL_RECALL_NO, getRace().getId().toString(), getActivity());
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
private void showDisplayBlueFlagDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(getActivity().getResources().getString(R.string.confirmation_blue_flag_display))
.setCancelable(true)
.setPositiveButton(getActivity().getResources().getString(R.string.yes), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ExLog.i(ExLog.FLAG_BLUE_SET, getRace().getId().toString(), getActivity());
getRace().getState().getStartProcedure().setFinishing(MillisecondsTimePoint.now());
}
})
.setNegativeButton(getActivity().getResources().getString(R.string.no), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ExLog.i(ExLog.FLAG_BLUE_SET_NO, getRace().getId().toString(), getActivity());
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
@Override
public void onStart() {
super.onStart();
ExLog.w(RunningRaceFragment.class.getName(), String.format("Fragment %s is now shown", RunningRaceFragment.class.getName()));
}
public void notifyTick() {
if (getRace().getState().getStartTime() == null)
return;
long millisSinceStart = System.currentTimeMillis() - getRace().getState().getStartTime().asMillis();
setStarttimeCountupLabel(millisSinceStart);
//TODO: implement count down label text when individual recall is displayed
}
private void setStarttimeCountupLabel(long millisecondsSinceStart) {
countUpTextView.setText(String.format(getString(R.string.race_running_since_template), prettyTimeString(millisecondsSinceStart), getRace().getName()));
}
protected CharSequence prettyTimeString(long time) {
int secondsStart = (int) (time / 1000);
int hours = secondsStart / 3600;
int minutes = (secondsStart % 3600) / 60;
int seconds = (secondsStart % 60);
String timePattern = "%s:%s:%s";
String secondsString = seconds < 10 ? "0" + seconds : "" + seconds;
String minutesString = minutes < 10 ? "0" + minutes : "" + minutes;
String hoursString = hours < 10 ? "0" + hours : "" + hours;
return String.format(timePattern, hoursString, minutesString, secondsString);
}
private void showChooseAPNovemberDialog() {
FragmentManager fragmentManager = getFragmentManager();
RaceDialogFragment fragment = new AbortTypeSelectionDialog();
Bundle args = getRecentArguments();
fragment.setArguments(args);
fragment.show(fragmentManager, "dialogAPNovemberMode");
}
@Override
public void removeIndividualRecallFlag() {
setIndividualRecallRemovedInView();
}
@Override
public void displayIndividualRecallFlag() {
setIndividualRecallDisplayedInView();
}
private void setIndividualRecallDisplayedInView() {
moveImageUp(individualRecallFlag);
String unsetXray = getActivity().getResources().getString(R.string.choose_xray_flag_down);
individualRecallLabel.setText(unsetXray);
}
private void setIndividualRecallRemovedInView() {
moveImageDown(individualRecallFlag);
//setXrayCountdownLabel();
String setIndividualRecallUp = getActivity().getResources().getString(R.string.choose_xray_flag_up);
individualRecallLabel.setText(setIndividualRecallUp);
}
protected void moveImageUp(ImageView image) {
moveImage(image, 1, 0);
}
protected void moveImageDown(ImageView image) {
moveImage(image, 0, 1);
}
protected void moveImage(ImageView image, int parentTop, int parentBottom) {
LayoutParams params = (RelativeLayout.LayoutParams) image.getLayoutParams();
params.addRule(RelativeLayout.ALIGN_PARENT_TOP, parentTop);
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, parentBottom);
image.setLayoutParams(params);
}
}
package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo;
import android.app.AlertDialog;
import android.app.FragmentManager;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView;
import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.domain.startprocedure.impl.EssRunningRaceEventListener;
import com.sap.sailing.racecommittee.app.domain.startprocedure.impl.ExtremeSailingSeriesStartProcedure;
import com.sap.sailing.racecommittee.app.logging.ExLog;
import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.AbortTypeSelectionDialog;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.RaceDialogFragment;
public class EssRunningRaceFragment extends RaceFragment implements EssRunningRaceEventListener {
private TextView countUpTextView;
private ImageView individualRecallFlag;
private TextView individualRecallLabel;
ImageButton abortingFlagButton;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.race_running_view, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
countUpTextView = (TextView) getView().findViewById(R.id.raceCountUp);
individualRecallFlag = (ImageView) getView().findViewById(R.id.xrayFlag);
individualRecallLabel = (TextView) getView().findViewById(R.id.individualRecallLabel);
ImageButton blueFlagButton = (ImageButton) getView().findViewById(R.id.blueFlagButton);
blueFlagButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showDisplayBlueFlagDialog();
}
});
abortingFlagButton = (ImageButton) getView().findViewById(R.id.abortingFlagButton);
abortingFlagButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showChooseAPNovemberDialog();
}
});
ImageButton generalRecallFlagButton = (ImageButton) getView().findViewById(R.id.firstSubstituteButton);
generalRecallFlagButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showDisplayGeneralRecallDialog();
}
});
ImageButton individualRecallButton = (ImageButton) getView().findViewById(R.id.individualRecallButton);
individualRecallButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
TimePoint now = MillisecondsTimePoint.now();
if (getRace().getState().getStartProcedure() instanceof ExtremeSailingSeriesStartProcedure) {
ExtremeSailingSeriesStartProcedure essStartProcedure = ((ExtremeSailingSeriesStartProcedure) getRace().getState().getStartProcedure());
if (essStartProcedure.getIndividualRecallDisplayedTime() == null) {
essStartProcedure.setIndividualRecall(now);
} else {
essStartProcedure.setIndividualRecallRemoval(now);
}
}
}
});
}
private void showDisplayGeneralRecallDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(getActivity().getResources().getString(R.string.confirmation_first_substitute_display))
.setCancelable(true)
.setPositiveButton(getActivity().getResources().getString(R.string.yes), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ExLog.i(ExLog.RACE_RUNNING_GENERAL_RECALL_YES, getRace().getId().toString(), getActivity());
getRace().getState().getStartProcedure().setGeneralRecall(MillisecondsTimePoint.now());
}
})
.setNegativeButton(getActivity().getResources().getString(R.string.no), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ExLog.i(ExLog.RACE_RUNNING_GENERAL_RECALL_NO, getRace().getId().toString(), getActivity());
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
private void showDisplayBlueFlagDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(getActivity().getResources().getString(R.string.confirmation_blue_flag_display))
.setCancelable(true)
.setPositiveButton(getActivity().getResources().getString(R.string.yes), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ExLog.i(ExLog.FLAG_BLUE_SET, getRace().getId().toString(), getActivity());
getRace().getState().getStartProcedure().setFinishing(MillisecondsTimePoint.now());
}
})
.setNegativeButton(getActivity().getResources().getString(R.string.no), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ExLog.i(ExLog.FLAG_BLUE_SET_NO, getRace().getId().toString(), getActivity());
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
@Override
public void onStart() {
super.onStart();
getRace().getState().getStartProcedure().setRunningRaceEventListener(this);
ExLog.w(EssRunningRaceFragment.class.getName(), String.format("Fragment %s is now shown", EssRunningRaceFragment.class.getName()));
}
public void notifyTick() {
if (getRace().getState().getStartTime() == null)
return;
long millisSinceStart = System.currentTimeMillis() - getRace().getState().getStartTime().asMillis();
setStarttimeCountupLabel(millisSinceStart);
//TODO: implement count down label text when individual recall is displayed
}
private void setStarttimeCountupLabel(long millisecondsSinceStart) {
countUpTextView.setText(String.format(getString(R.string.race_running_since_template), prettyTimeString(millisecondsSinceStart), getRace().getName()));
}
protected CharSequence prettyTimeString(long time) {
int secondsStart = (int) (time / 1000);
int hours = secondsStart / 3600;
int minutes = (secondsStart % 3600) / 60;
int seconds = (secondsStart % 60);
String timePattern = "%s:%s:%s";
String secondsString = seconds < 10 ? "0" + seconds : "" + seconds;
String minutesString = minutes < 10 ? "0" + minutes : "" + minutes;
String hoursString = hours < 10 ? "0" + hours : "" + hours;
return String.format(timePattern, hoursString, minutesString, secondsString);
}
private void showChooseAPNovemberDialog() {
FragmentManager fragmentManager = getFragmentManager();
RaceDialogFragment fragment = new AbortTypeSelectionDialog();
Bundle args = getRecentArguments();
fragment.setArguments(args);
fragment.show(fragmentManager, "dialogAPNovemberMode");
}
@Override
public void onIndividualRecallRemoval() {
setIndividualRecallRemovedInView();
}
@Override
public void onIndividualRecall() {
setIndividualRecallDisplayedInView();
}
private void setIndividualRecallDisplayedInView() {
moveImageUp(individualRecallFlag);
String unsetXray = getActivity().getResources().getString(R.string.choose_xray_flag_down);
individualRecallLabel.setText(unsetXray);
}
private void setIndividualRecallRemovedInView() {
moveImageDown(individualRecallFlag);
//setXrayCountdownLabel();
String setIndividualRecallUp = getActivity().getResources().getString(R.string.choose_xray_flag_up);
individualRecallLabel.setText(setIndividualRecallUp);
}
protected void moveImageUp(ImageView image) {
moveImage(image, 1, 0);
}
protected void moveImageDown(ImageView image) {
moveImage(image, 0, 1);
}
protected void moveImage(ImageView image, int parentTop, int parentBottom) {
LayoutParams params = (RelativeLayout.LayoutParams) image.getLayoutParams();
params.addRule(RelativeLayout.ALIGN_PARENT_TOP, parentTop);
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, parentBottom);
image.setLayoutParams(params);
}
}
@@ -16,6 +16,7 @@ import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.domain.racelog.analyzing.impl.LastFlagFinder;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.domain.startprocedure.impl.GateStartProcedure;
import com.sap.sailing.racecommittee.app.domain.startprocedure.impl.GateStartRunningRaceEventListener;
import com.sap.sailing.racecommittee.app.logging.ExLog;
import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment;
@@ -75,12 +76,16 @@ public class GateStartRunningRaceFragment extends RaceFragment implements GateSt
getRace().getState().getStartProcedure().setRunningRaceEventListener(this);
if(getRace().getState().getPathfinder()==null){
showPathFinderDialog();
}
if(getRace().getState().getGateLineOpeningTime()==null){
showLineOpeningTimeDialog();
if(getRace().getState().getStartProcedure() instanceof GateStartProcedure){
if(((GateStartProcedure) getRace().getState().getStartProcedure()).getPathfinder()==null){
showPathFinderDialog();
}
if(((GateStartProcedure) getRace().getState().getStartProcedure()).getGateLineOpeningTime()==null){
showLineOpeningTimeDialog();
}
}
}
private void displayGolfFlag(boolean golfFlagDisplayed) {
@@ -22,6 +22,7 @@ import com.sap.sailing.domain.racelog.RaceLogFlagEvent;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.domain.startprocedure.impl.GateStartPhaseEventListener;
import com.sap.sailing.racecommittee.app.domain.startprocedure.impl.GateStartProcedure;
import com.sap.sailing.racecommittee.app.logging.ExLog;
import com.sap.sailing.racecommittee.app.ui.fragments.RaceFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.dialogs.AbortModeSelectionDialog;
@@ -95,13 +96,19 @@ public class GateStartPhaseFragment extends RaceFragment implements GateStartPha
pathFinderButton = (Button) getView().findViewById(R.id.pathFinderButton);
lineOpeningTimeButton = (Button) getView().findViewById(R.id.lineOpeningTimeButton);
pathfinderLabel = (TextView) getView().findViewById(R.id.pathfinderLabel);
if(getRace().getState().getPathfinder()!=null){
pathfinderLabel.setText(getRace().getState().getPathfinder());
}
lineOpeningTimeLabel = (TextView) getView().findViewById(R.id.lineOpeningTimeLabel);
if(getRace().getState().getGateLineOpeningTime()!=null){
lineOpeningTimeLabel.setText(String.valueOf(getRace().getState().getGateLineOpeningTime()/(60 * 1000))+" minutes");
if(getRace().getState().getStartProcedure() instanceof GateStartProcedure){
GateStartProcedure gateStartProcedure = ((GateStartProcedure) getRace().getState().getStartProcedure());
if(gateStartProcedure.getPathfinder()!=null){
pathfinderLabel.setText(gateStartProcedure.getPathfinder());
}
if(gateStartProcedure.getGateLineOpeningTime()!=null){
lineOpeningTimeLabel.setText(String.valueOf(gateStartProcedure.getGateLineOpeningTime()/(60 * 1000))+" minutes");
}
}
pathFinderButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
@@ -233,15 +240,22 @@ public class GateStartPhaseFragment extends RaceFragment implements GateStartPha
@Override
public void updatePathfinderLabel() {
if (getRace().getState().getPathfinder() != null) {
pathfinderLabel.setText(getRace().getState().getPathfinder());
if (getRace().getState().getStartProcedure() instanceof GateStartProcedure) {
GateStartProcedure gateStartProcedure = ((GateStartProcedure) getRace().getState().getStartProcedure());
if (gateStartProcedure.getPathfinder() != null) {
pathfinderLabel.setText(gateStartProcedure.getPathfinder());
}
}
}
@Override
public void updateGateLineOpeningTimeLabel() {
if (getRace().getState().getGateLineOpeningTime() != null) {
lineOpeningTimeLabel.setText(String.valueOf(getRace().getState().getGateLineOpeningTime()/(60 * 1000))+" minutes");
if (getRace().getState().getStartProcedure() instanceof GateStartProcedure) {
GateStartProcedure gateStartProcedure = ((GateStartProcedure) getRace().getState().getStartProcedure());
if (gateStartProcedure.getGateLineOpeningTime() != null) {
lineOpeningTimeLabel.setText(String.valueOf(gateStartProcedure.getGateLineOpeningTime() / (60 * 1000))
+ " minutes");
}
}
}
}