diff --git a/build.gradle b/build.gradle index a485afff7b7..7440865efce 100644 --- a/build.gradle +++ b/build.gradle @@ -22,3 +22,23 @@ allprojects { targetCompatibility = "1.7" } } + +// dependency versions for all sub modules +ext { + // regular + buildTools = "22.0.1" + compileSdk = 22 + minSdk = 14 + targetSdk = 22 + + support = "22.1.1" + play_services = "7.3.0" + + // testing - jvm + junit = "4.12" + mockito = "1.9.5" + + // testing - ui + test = "0.2" + espresso = "2.1" +} \ No newline at end of file diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/BaseRacingProcedure.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/BaseRacingProcedure.java index 8493a7bb1ac..e1bacfe4d6e 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/BaseRacingProcedure.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/racingprocedure/impl/BaseRacingProcedure.java @@ -2,6 +2,7 @@ package com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl; import java.util.Arrays; import java.util.Collection; +import java.util.logging.Logger; import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.race.RaceLog; @@ -29,6 +30,7 @@ import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProce import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedureChangedListener; import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration; import com.sap.sailing.domain.common.racelog.Flags; +import com.sap.sse.common.Duration; import com.sap.sse.common.TimePoint; /** @@ -40,8 +42,11 @@ import com.sap.sse.common.TimePoint; */ public abstract class BaseRacingProcedure extends BaseRaceStateChangedListener implements RacingProcedure, RaceLogChangedListener { - - private final static long individualRecallRemovalTimeout = 4 * 60 * 1000; // minutes * seconds * milliseconds + private static final Logger logger = Logger.getLogger(BaseRacingProcedure.class.getName()); + /** + * The time since race start after which the X-ray flag has to go down + */ + private final static Duration individualRecallRemovalTimeout = Duration.ONE_MINUTE.times(4); private RaceStateEventScheduler scheduler; @@ -57,9 +62,11 @@ public abstract class BaseRacingProcedure extends BaseRaceStateChangedListener i private final FinishingTimeFinder finishingTimeFinder; private final FinishedTimeFinder finishedTimeFinder; private final RaceLogEventVisitor raceLogListener; + private final StartTimeFinder startTimeFinder; private boolean cachedIsIndividualRecallDisplayed; + /** * When calling me, call {@link BaseRacingProcedure#update()} afterwards! * @@ -84,8 +91,7 @@ public abstract class BaseRacingProcedure extends BaseRaceStateChangedListener i this.recallRemovedFinder = new IndividualRecallRemovedFinder(raceLog); this.finishingTimeFinder = new FinishingTimeFinder(raceLog); this.finishedTimeFinder = new FinishedTimeFinder(raceLog); - // Use the following in order to initialize a start time finder once it's needed for start time-dependent individual recall timeouts - // this.startTimeFinder = new StartTimeFinder(raceLogResolver, raceLog); + this.startTimeFinder = new StartTimeFinder(raceLogResolver, raceLog); this.raceLogListener = new RaceLogChangedVisitor(this); this.raceLog.addListener(raceLogListener); @@ -133,7 +139,7 @@ public abstract class BaseRacingProcedure extends BaseRaceStateChangedListener i break; case RUNNING: if (isIndividualRecallDisplayed()) { - rescheduleIndividualRecallTimeout(recallDisplayedFinder.analyze()); + rescheduleIndividualRecallTimeout(getIndividualRecallRemovalTime()); } break; default: @@ -172,7 +178,16 @@ public abstract class BaseRacingProcedure extends BaseRaceStateChangedListener i } } if (displayed != null) { - return displayed.plus(individualRecallRemovalTimeout); + final TimePoint raceStartTime = startTimeFinder.analyze().getStartTime(); + final TimePoint referenceTimePoint; + if (raceStartTime != null) { + referenceTimePoint = raceStartTime; + } else { + logger.warning("An individual recall was set but we don't have a start time set for the race; using individual recall set time "+ + displayed+" + timeout ("+individualRecallRemovalTimeout+") for implicit termination of individual recall"); + referenceTimePoint = displayed; + } + return referenceTimePoint.plus(individualRecallRemovalTimeout); } return null; } @@ -218,7 +233,7 @@ public abstract class BaseRacingProcedure extends BaseRaceStateChangedListener i cachedIsIndividualRecallDisplayed = isRecallDisplayed; if (cachedIsIndividualRecallDisplayed) { changedListeners.onIndividualRecallDisplayed(this); - rescheduleIndividualRecallTimeout(recallDisplayedFinder.analyze()); + rescheduleIndividualRecallTimeout(getIndividualRecallRemovalTime()); } else { changedListeners.onIndividualRecallRemoved(this); unscheduleStateEvent(RaceStateEvents.INDIVIDUAL_RECALL_TIMEOUT); @@ -231,9 +246,9 @@ public abstract class BaseRacingProcedure extends BaseRaceStateChangedListener i changedListeners.onActiveFlagsChanged(this); } - private void rescheduleIndividualRecallTimeout(TimePoint displayTime) { + private void rescheduleIndividualRecallTimeout(TimePoint removalTime) { unscheduleStateEvent(RaceStateEvents.INDIVIDUAL_RECALL_TIMEOUT); - scheduleStateEvents(new RaceStateEventImpl(displayTime.plus(individualRecallRemovalTimeout), RaceStateEvents.INDIVIDUAL_RECALL_TIMEOUT)); + scheduleStateEvents(new RaceStateEventImpl(removalTime, RaceStateEvents.INDIVIDUAL_RECALL_TIMEOUT)); } protected void scheduleStateEvents(RaceStateEvent stateEvent) { diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index bb5ccfd6455..786c4db1a11 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -1024,7 +1024,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl // competitor has finished race at or before the requested time point; use time point of crossing the finish line end = markPassings.last().getTimePoint(); } else if ((trackedLegOfCompetitor=getTrackedLeg(competitor, timePoint)) == null || - (!trackedLegOfCompetitor.hasFinishedLeg(timePoint) + (!trackedLegOfCompetitor.hasFinishedLeg(getEndOfTracking()) && ((getEndOfTracking() != null && timePoint.after(getEndOfTracking())) || getStatus().getStatus() == TrackedRaceStatusEnum.FINISHED))) { // If the race is no longer tracking and hence no more data can be expected, and the competitor diff --git a/mobile/com.sap.sailing.android.shared/build.gradle b/mobile/com.sap.sailing.android.shared/build.gradle index e66fa9ea8df..46512fca61b 100644 --- a/mobile/com.sap.sailing.android.shared/build.gradle +++ b/mobile/com.sap.sailing.android.shared/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.library' android { - buildToolsVersion "22.0.1" - compileSdkVersion 22 + buildToolsVersion rootProject.ext.buildTools + compileSdkVersion rootProject.ext.compileSdk defaultConfig { - minSdkVersion 14 - targetSdkVersion 22 + minSdkVersion rootProject.ext.minSdk + targetSdkVersion rootProject.ext.targetSdk } sourceSets { @@ -39,7 +39,7 @@ android { dependencies { /* support libraries */ - compile 'com.android.support:appcompat-v7:22.1.1' + compile "com.android.support:appcompat-v7:${rootProject.ext.support}" /* local dependencies */ compile project(':java:com.sap.sailing.domain.common') @@ -49,7 +49,7 @@ dependencies { compile project(':java:org.json.simple') /* Google Play Services */ - compile "com.google.android.gms:play-services-location:7.3.0" + compile "com.google.android.gms:play-services-location:${rootProject.ext.play_services}" /* all local jar-libs */ compile fileTree(dir: "libs", include: ["*.jar"]) diff --git a/mobile/com.sap.sailing.android.tracking.app/build.gradle b/mobile/com.sap.sailing.android.tracking.app/build.gradle index f788fae789f..ddd01ce0d99 100644 --- a/mobile/com.sap.sailing.android.tracking.app/build.gradle +++ b/mobile/com.sap.sailing.android.tracking.app/build.gradle @@ -5,13 +5,13 @@ def packageName = "com.sap.sailing.android.tracking.app" def verCode = 1 android { - buildToolsVersion "22.0.1" - compileSdkVersion 22 + buildToolsVersion rootProject.ext.buildTools + compileSdkVersion rootProject.ext.compileSdk defaultConfig { applicationId packageName - minSdkVersion 14 - targetSdkVersion 22 + minSdkVersion rootProject.ext.minSdk + targetSdkVersion rootProject.ext.targetSdk versionCode verCode versionName "$verCode - Altitude" useJack false // not working on Windows yet @@ -69,25 +69,25 @@ android { dependencies { /* support libraries */ - compile "com.android.support:appcompat-v7:22.1.1" + compile "com.android.support:appcompat-v7:${rootProject.ext.support}" /* Google Play Services */ - compile "com.google.android.gms:play-services-gcm:7.3.0" - compile "com.google.android.gms:play-services-location:7.3.0" + compile "com.google.android.gms:play-services-gcm:${rootProject.ext.play_services}" + compile "com.google.android.gms:play-services-location:${rootProject.ext.play_services}" /* local dependencies */ compile project(":mobile:com.sap.sailing.android.shared") /* JVM tests */ - testCompile 'junit:junit:4.12' - testCompile "org.mockito:mockito-core:1.9.5" + testCompile "junit:junit:${rootProject.ext.junit}" + testCompile "org.mockito:mockito-core:${rootProject.ext.mockito}" /* UI testing with espresso */ - androidTestCompile "com.android.support:support-annotations:22.1.1" - androidTestCompile "com.android.support.test:runner:0.2" - androidTestCompile "com.android.support.test:rules:0.2" - androidTestCompile "com.android.support.test.espresso:espresso-core:2.1" - androidTestCompile ("com.android.support.test.espresso:espresso-contrib:2.1") { + androidTestCompile "com.android.support:support-annotations:${rootProject.ext.support}" + androidTestCompile "com.android.support.test:runner:${rootProject.ext.test}" + androidTestCompile "com.android.support.test:rules:${rootProject.ext.test}" + androidTestCompile "com.android.support.test.espresso:espresso-core:${rootProject.ext.espresso}" + androidTestCompile ("com.android.support.test.espresso:espresso-contrib:${rootProject.ext.espresso}") { exclude group: "com.android.support", module: "appcompat" exclude group: "com.android.support", module: "support-v4" exclude module: "recyclerview-v7" diff --git a/mobile/com.sap.sailing.buoy.positioning/build.gradle b/mobile/com.sap.sailing.buoy.positioning/build.gradle index 2cc20da075f..79c2d2ffad4 100644 --- a/mobile/com.sap.sailing.buoy.positioning/build.gradle +++ b/mobile/com.sap.sailing.buoy.positioning/build.gradle @@ -5,13 +5,13 @@ def packageName = "com.sap.sailing.buoy.positioning.app" def verCode = 1 android { - buildToolsVersion "22.0.1" - compileSdkVersion 22 + buildToolsVersion rootProject.ext.buildTools + compileSdkVersion rootProject.ext.compileSdk defaultConfig { applicationId packageName - minSdkVersion 14 - targetSdkVersion 22 + minSdkVersion rootProject.ext.minSdk + targetSdkVersion rootProject.ext.targetSdk versionCode verCode versionName "$verCode - Altitude" useJack false // not working on Windows yet @@ -69,24 +69,24 @@ android { dependencies { /* support libraries */ - compile "com.android.support:appcompat-v7:22.1.1" + compile "com.android.support:appcompat-v7:${rootProject.ext.support}" /* Google Play Services */ - compile "com.google.android.gms:play-services-location:7.3.0" + compile "com.google.android.gms:play-services-location:${rootProject.ext.play_services}" /* local dependencies */ compile project(":mobile:com.sap.sailing.android.shared") /* JVM tests */ - testCompile 'junit:junit:4.12' - testCompile "org.mockito:mockito-core:1.9.5" + testCompile "junit:junit:${rootProject.ext.junit}" + testCompile "org.mockito:mockito-core:${rootProject.ext.mockito}" /* UI testing with espresso */ - androidTestCompile "com.android.support:support-annotations:22.1.1" - androidTestCompile "com.android.support.test:runner:0.2" - androidTestCompile "com.android.support.test:rules:0.2" - androidTestCompile "com.android.support.test.espresso:espresso-core:2.1" - androidTestCompile ("com.android.support.test.espresso:espresso-contrib:2.1") { + androidTestCompile "com.android.support:support-annotations:${rootProject.ext.support}" + androidTestCompile "com.android.support.test:runner:${rootProject.ext.test}" + androidTestCompile "com.android.support.test:rules:${rootProject.ext.test}" + androidTestCompile "com.android.support.test.espresso:espresso-core:${rootProject.ext.espresso}" + androidTestCompile ("com.android.support.test.espresso:espresso-contrib:${rootProject.ext.espresso}") { exclude group: "com.android.support", module: "appcompat" exclude group: "com.android.support", module: "support-v4" exclude module: "recyclerview-v7" diff --git a/mobile/com.sap.sailing.racecommittee.app/build.gradle b/mobile/com.sap.sailing.racecommittee.app/build.gradle index 84e5765a0bf..ceeea7934e1 100644 --- a/mobile/com.sap.sailing.racecommittee.app/build.gradle +++ b/mobile/com.sap.sailing.racecommittee.app/build.gradle @@ -5,13 +5,13 @@ def packageName = "com.sap.sailing.racecommittee.app" def verCode = 7 android { - buildToolsVersion "22.0.1" - compileSdkVersion 22 + buildToolsVersion rootProject.ext.buildTools + compileSdkVersion rootProject.ext.compileSdk defaultConfig { applicationId packageName - minSdkVersion 14 - targetSdkVersion 22 + minSdkVersion rootProject.ext.minSdk + targetSdkVersion rootProject.ext.targetSdk versionCode verCode versionName "$verCode - Laser" useJack false // not working on Windows yet @@ -75,11 +75,11 @@ dependencies { compile "com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:0.6.2" /* support libraries */ - compile "com.android.support:appcompat-v7:22.1.1" - compile "com.android.support:recyclerview-v7:22.1.1" + compile "com.android.support:appcompat-v7:${rootProject.ext.support}" + compile "com.android.support:recyclerview-v7:${rootProject.ext.support}" /* Google Play Services */ - compile "com.google.android.gms:play-services-location:7.3.0" + compile "com.google.android.gms:play-services-location:${rootProject.ext.play_services}" /* local dependencies */ compile project(":mobile:com.sap.sailing.android.shared") @@ -88,15 +88,15 @@ dependencies { compile fileTree(dir: "libs", include: ["*.jar"]) /* JVM tests */ - testCompile 'junit:junit:4.12' - testCompile "org.mockito:mockito-core:1.9.5" + testCompile "junit:junit:${rootProject.ext.junit}" + testCompile "org.mockito:mockito-core:${rootProject.ext.mockito}" /* UI testing with espresso */ - androidTestCompile "com.android.support:support-annotations:22.1.1" - androidTestCompile "com.android.support.test:runner:0.2" - androidTestCompile "com.android.support.test:rules:0.2" - androidTestCompile "com.android.support.test.espresso:espresso-core:2.1" - androidTestCompile ("com.android.support.test.espresso:espresso-contrib:2.1") { + androidTestCompile "com.android.support:support-annotations:${rootProject.ext.support}" + androidTestCompile "com.android.support.test:runner:${rootProject.ext.test}" + androidTestCompile "com.android.support.test:rules:${rootProject.ext.test}" + androidTestCompile "com.android.support.test.espresso:espresso-core:${rootProject.ext.espresso}" + androidTestCompile ("com.android.support.test.espresso:espresso-contrib:${rootProject.ext.espresso}") { exclude group: "com.android.support", module: "appcompat" exclude group: "com.android.support", module: "support-v4" exclude module: "recyclerview-v7" diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/race_time_picker.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_time_picker.xml index 438a48240cd..b2594e2d1bb 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/layout/race_time_picker.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/race_time_picker.xml @@ -40,13 +40,12 @@