Merge branch 'master' into bug4343

This commit is contained in:
Steffen Schaefer committed 2018-06-25 08:15:43 +02:00
commit 63fc382dfe
33 files changed
+431 -256

No files matched your search

@@ -10,6 +10,7 @@ import com.sap.sailing.domain.base.configuration.procedures.RRS26Configuration;
import com.sap.sailing.domain.base.configuration.procedures.SWCStartConfiguration;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sse.common.Duration;
/**
* Interface holding configuration options for a Regatta, including configurations for
@@ -26,6 +27,12 @@ public interface RegattaConfiguration extends Serializable, Cloneable {
* Gets the default {@link RacingProcedureType} for races configured.
*/
RacingProcedureType getDefaultRacingProcedureType();
/**
* Gets the default protest time duration. May be {@code null} in case no default is set for the
* regatta.
*/
Duration getDefaultProtestTimeDuration();
/**
* Gets the configuration for RRS26 races.
@@ -4,6 +4,7 @@ import com.sap.sailing.domain.base.configuration.ConfigurationLoader;
import com.sap.sailing.domain.base.configuration.RegattaConfiguration;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sse.common.Duration;
/**
* Is empty, does nothing on store and load.
@@ -17,6 +18,7 @@ public class EmptyRegattaConfiguration extends RegattaConfigurationImpl implemen
public RegattaConfiguration load() {
setDefaultRacingProcedureType(RacingProcedureType.UNKNOWN);
setDefaultCourseDesignerMode(CourseDesignerMode.UNKNOWN);
setDefaultProtestTimeDuration(Duration.ONE_MINUTE.times(90));
setRRS26Configuration(new RRS26ConfigurationImpl());
setSWCStartConfiguration(new SWCStartConfigurationImpl());
setGateStartConfiguration(new GateStartConfigurationImpl());
@@ -9,6 +9,7 @@ import com.sap.sailing.domain.base.configuration.procedures.RRS26Configuration;
import com.sap.sailing.domain.base.configuration.procedures.SWCStartConfiguration;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sse.common.Duration;
public class RegattaConfigurationImpl implements RegattaConfiguration {
@@ -16,6 +17,7 @@ public class RegattaConfigurationImpl implements RegattaConfiguration {
private RacingProcedureType defaultRacingProcedureType;
private CourseDesignerMode defaultCourseDesignerMode;
private Duration defaultProtestTimeDuration;
private RRS26Configuration rrs26Configuration;
private SWCStartConfiguration swcStartConfiguration;
@@ -42,6 +44,15 @@ public class RegattaConfigurationImpl implements RegattaConfiguration {
defaultCourseDesignerMode = mode;
}
@Override
public Duration getDefaultProtestTimeDuration() {
return defaultProtestTimeDuration;
}
public void setDefaultProtestTimeDuration(Duration defaultProtestTimeDuration) {
this.defaultProtestTimeDuration = defaultProtestTimeDuration;
}
@Override
public RRS26Configuration getRRS26Configuration() {
return rrs26Configuration;
@@ -101,6 +112,7 @@ public class RegattaConfigurationImpl implements RegattaConfiguration {
RegattaConfigurationImpl copy = new RegattaConfigurationImpl();
copy.setDefaultRacingProcedureType(defaultRacingProcedureType);
copy.setDefaultCourseDesignerMode(defaultCourseDesignerMode);
copy.setDefaultProtestTimeDuration(defaultProtestTimeDuration);
copy.setRRS26Configuration(rrs26Configuration);
copy.setSWCStartConfiguration(swcStartConfiguration);
copy.setGateStartConfiguration(gateStartConfiguration);
@@ -120,6 +132,9 @@ public class RegattaConfigurationImpl implements RegattaConfiguration {
if (update.getDefaultRacingProcedureType() != null) {
target.setDefaultRacingProcedureType(update.getDefaultRacingProcedureType());
}
if (update.getDefaultProtestTimeDuration() != null) {
target.setDefaultProtestTimeDuration(update.getDefaultProtestTimeDuration());
}
if (update.getRRS26Configuration() != null) {
target.setRRS26Configuration(
(RRS26Configuration) target.getRRS26Configuration().merge(update.getRRS26Configuration()));
@@ -4,6 +4,14 @@
<div id="mainContent">
<h4 class="articleHeadline">What's New - SAP Sailing Race Manager</h4>
<div class="innerContent">
<h5 class="articleSubheadline">February 2018</h5>
<ul class="bulletList">
<li>The protest time is now configurable in the backend. An empty value means, the RCApp
will take 90 minutes as default. If no time is set in the backend, the RCApp will save a
custom duration as new default. A server side duration (device or regatta specific) will always
be the default.</li>
</ul>
<h5 class="articleSubheadline">August 2017</h5>
<ul class="bulletList">
<li>The result list can now be edited without a finish time.</li>
@@ -26,8 +26,6 @@ public interface AnniversaryLegalMessages extends Messages{
String anniversaryLegalNoticeSectionContestParagraph(int anniversary);
String anniversaryLegalNoticeSectionCommunicationParagraphTitle();
String anniversaryLegalNoticeSectionCommunicationParagraph();
String anniversaryLegalNoticeSectionCharitablyPurposeParagraphTitle();
String anniversaryLegalNoticeSectionCharitablyPurposeParagraph();
String anniversaryLegalNoticeSectionPrizesParagraphTitle();
String anniversaryLegalNoticeSectionPrizesParagraph(int anniversary);
String anniversaryLegalNoticeSectionPersonalDataAndRightsToImagesParagraphTitle();
@@ -7,18 +7,16 @@ anniversaryLegalNoticeSectionOrganizationAndParticipationParagraph3=The organize
anniversaryLegalNoticeSectionRequirementsHeadline=Prerequisites
anniversaryLegalNoticeSectionRequirementsListItem1=SAP Sailing Analytics must be responsible for the live data analysis of each race.
anniversaryLegalNoticeSectionRequirementsListItem2=To win the prize, a race must enter into the regatta evaluation and be finished.
anniversaryLegalNoticeSectionRequirementsListItem3=The \u20AC10,000 are to be used solely for charitable purposes.
anniversaryLegalNoticeSectionRequirementsListItem3=The prize money is used solely for the purpose of paying catering (food, beverage, service).
anniversaryLegalNoticeSectionContestParagraphTitle=Contest
anniversaryLegalNoticeSectionContestParagraph=The contest will run until the {0,number,#,###}th race has begun.
anniversaryLegalNoticeSectionCommunicationParagraphTitle=Notification
anniversaryLegalNoticeSectionCommunicationParagraph=The winner will be automatically announced at www.sapsailing.com.
anniversaryLegalNoticeSectionCharitablyPurposeParagraphTitle=Charitable purposes
anniversaryLegalNoticeSectionCharitablyPurposeParagraph=The charitable purpose for which the prize is to be used must fulfill certain requirements. The winner must invest the prize in promoting sports, education, literature, the public good, health and safety, the fight against poverty, or similar aims without attempting to gain any private benefit, profit, or political influence.
anniversaryLegalNoticeSectionPrizesParagraphTitle=Prizes
anniversaryLegalNoticeSectionPrizesParagraph=The organizer of the {0,number,#,###}th race will receive the prize money.
anniversaryLegalNoticeSectionPersonalDataAndRightsToImagesParagraphTitle=Personal data and image rights
anniversaryLegalNoticeSectionPersonalDataAndRightsToImagesParagraph1=By participating in the contest, each organizer grants permission (and warrants to have received corresponding consent from its members) to the organizer, its subsidiaries and affiliated businesses, respective licensees, successors, and assignees to use the contest winner''s name, likeness, and entry for purposes of advertising and trade without further notice, consent, or compensation with regard to the contest and the event at which the contest took place, unless prohibited by law. This includes printing, publishing, broadcasting, distributing, and using the contest winner''s name, portrait, picture, voice, likeness, or image (or statements from associated members about the contest) for promotional purposes in any media now known or hereafter arising anywhere in the world.
anniversaryLegalNoticeSectionPersonalDataAndRightsToImagesParagraph2=SAP SE has set the total sum at \u20AC10,000. Event organizers must propose a charitable purpose for which they plan to use the prize to SAP SE. SAP SE reserves the right to approve these proposals or reject them should they not be deemed charitable.
anniversaryLegalNoticeSectionPersonalDataAndRightsToImagesParagraph2=SAP SE has set the total sum at \u20AC3,000. Event organizers must propose a catering plan to SAP SE. SAP SE reserves the right to approve the proposal or reject it.
anniversaryLegalNoticeSectionDisclaimerSectionParagraphTitle=Disclaimer
anniversaryLegalNoticeSectionDisclaimerSectionParagraph=SAP will assume no responsibility or liability for incomplete, inaccurate, or misdirected entries.
anniversaryLegalNoticeSectionOtherParagraphTitle=Additional information
@@ -41,10 +41,6 @@
<span><ui:text from="{i18n.anniversaryLegalNoticeSectionCommunicationParagraphTitle}"/></span>
<span><ui:text from="{i18n.anniversaryLegalNoticeSectionCommunicationParagraph}"/></span>
</p>
<p>
<span><ui:text from="{i18n.anniversaryLegalNoticeSectionCharitablyPurposeParagraphTitle}"/></span>
<span><ui:text from="{i18n.anniversaryLegalNoticeSectionCharitablyPurposeParagraph}"/></span>
</p>
<p>
<span><ui:text from="{i18n.anniversaryLegalNoticeSectionPrizesParagraphTitle}"/></span>
<span ui:field="legalNoticeSectionPrizes"></span>
@@ -23,12 +23,13 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO.RegattaConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO.RegattaConfigurationDTO.RacingProcedureConfigurationDTO;
import com.sap.sse.common.Duration;
import com.sap.sse.gwt.client.controls.IntegerBox;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class RegattaConfigurationDialog extends DataEntryDialog<DeviceConfigurationDTO.RegattaConfigurationDTO> {
private final AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
private final StringMessages stringMessages;
private final DeviceConfigurationDTO.RegattaConfigurationDTO originalConfiguration;
@@ -36,6 +37,7 @@ public class RegattaConfigurationDialog extends DataEntryDialog<DeviceConfigurat
private ListBox racingProcedureListBox;
private ListBox designerModeEntryListBox;
private IntegerBox protestTimeInMinutesTextBox;
private DisclosurePanel rrs26DisclosurePanel;
private CheckBox rrs26EnabledBox;
@@ -118,9 +120,10 @@ public class RegattaConfigurationDialog extends DataEntryDialog<DeviceConfigurat
}
private void setupGeneral() {
Grid grid = new Grid(2, 2);
Grid grid = new Grid(3, 2);
setupCourseDesignerListBox(grid, 0);
setupRacingProcedureListBox(grid, 1);
setupProtestTimeTextBox(grid, 2);
contentPanel.add(grid);
}
@@ -155,6 +158,14 @@ public class RegattaConfigurationDialog extends DataEntryDialog<DeviceConfigurat
grid.setWidget(gridRow, 1, designerModeEntryListBox);
}
private void setupProtestTimeTextBox(Grid grid, int gridRow) {
final Integer protestTimeDurationInMinutes = originalConfiguration.defaultProtestTimeDuration == null ? null :
(int) originalConfiguration.defaultProtestTimeDuration.asMinutes();
protestTimeInMinutesTextBox = createIntegerBox(protestTimeDurationInMinutes, 3);
grid.setWidget(gridRow, 0, new Label(stringMessages.protestTime()));
grid.setWidget(gridRow, 1, protestTimeInMinutesTextBox);
}
private ListBox setupClassFlagListBox(RacingProcedureConfigurationDTO config) {
ListBox box = createListBox(false);
Flags selectedFlag = null;
@@ -345,6 +356,7 @@ public class RegattaConfigurationDialog extends DataEntryDialog<DeviceConfigurat
if (originalConfiguration.gateStartConfiguration != null) {
gateStartGolfDownBox.setValue(originalConfiguration.gateStartConfiguration.hasAdditionalGolfDownTime);
}
grid.setWidget(0, 0, new Label(stringMessages.classFlag() + ":"));
grid.setWidget(0, 1, gateStartClassFlagListBox);
grid.setWidget(0, 2, createHelpImage(stringMessages.classFlagHelpText("Gate Start")));
@@ -500,6 +512,8 @@ public class RegattaConfigurationDialog extends DataEntryDialog<DeviceConfigurat
CourseDesignerMode mode = CourseDesignerMode.valueOf(designerModeEntryListBox.getValue(index));
result.defaultCourseDesignerMode = mode == CourseDesignerMode.UNKNOWN ? null : mode;
}
result.defaultProtestTimeDuration = protestTimeInMinutesTextBox.getValue() == null ? null :
Duration.ONE_MINUTE.times(protestTimeInMinutesTextBox.getValue());
if (rrs26EnabledBox.getValue()) {
result.rrs26Configuration = new DeviceConfigurationDTO.RegattaConfigurationDTO.RRS26ConfigurationDTO();
getRacingProcedureConfigurationResults(result.rrs26Configuration, rrs26ClassFlagListBox, rrs26RecallBox, rrs26ResultEntryBox);
@@ -1870,7 +1870,7 @@ anniversaryMajorCountdownTeaser[one]=Countdown! Only {0,number,#,###} race left
anniversaryMajorCountdownDescription=We are celebrating our {0,number,#,###}th race on www.sapsailing.com! Which race will break the mark? The organizer of this anniversary race will receive a total sum of 10,000 Euro for charity purposes. The winner will be announced on this website. Stay tuned and count with us.
anniversaryRepdigitCountdownTeaser=Countdown! Only {0,number,#,###} races left until the {1,number,#,###}th race.
anniversaryRepdigitCountdownTeaser[one]=Countdown! Only {0,number,#,###} race left until the {1,number,#,###}th race.
anniversaryRepdigitCountdownDescription=We are celebrating our lucky number races! Who will make the {0,number, #,###}th race on www.sapsailing.com? The participants of this race will get a free top-class summer festival from SAP. The winners will be announced on this website. Stay tuned and count with us.
anniversaryRepdigitCountdownDescription=We are celebrating our lucky number races! Who will make the {0,number, #,###}th race on www.sapsailing.com? The organizers will get a free barbecue with drinks. The winners will be announced on this website. Stay tuned and count with us.
anniversaryAnnouncementTeaser=Mission accomplished! {0,number,#,###} races with SAP Sailing Analytics!
anniversaryAnnouncementDescription= 3,2,1... We congratulate the participants of the race {0}. You did it! We thank you for your trust in SAP Sailing Analytics and hopefully continue sailing some more 10,000 races with you!
anniversaryRaceLinkText=Show anniversary race
@@ -1876,7 +1876,7 @@ anniversaryMajorCountdownTeaser[one]=Countdown! Noch {0,number,#,###} Rennen bis
anniversaryMajorCountdownDescription=Wir zelebrieren unser {0,number,#,###}. Rennen auf www.sapsailing.com! Welches Rennen schafft es die Marke zu durchbrechen? Der Veranstalter des Jubiläumsrennens erhält insgesamt 10.000 Euro für Wohltätigkeitszwecke. Der Gewinner wird auf der Website bekannt gegeben. Stay tuned.
anniversaryRepdigitCountdownTeaser=Countdown! Noch {0,number,#,###} Rennen bis zum {1,number,#,###}. Rennen.
anniversaryRepdigitCountdownTeaser[one]=Countdown! Noch {0,number,#,###} Rennen bis zum {1,number,#,###}. Rennen.
anniversaryRepdigitCountdownDescription=Wir zelebrieren unsere Schnapszahlenrennen! Wer schafft es das {0,number,#,###}. Rennen zu machen? Dem Gewinner schenkt SAP ein Sommerfest der Extraklasse! Der Gewinner wird auf der Website bekannt gegeben. Stay tuned.
anniversaryRepdigitCountdownDescription=Wir zelebrieren unsere Schnapszahlenrennen! Wer schafft es das {0,number,#,###}. Rennen zu machen? Den Veranstaltern schenkt SAP ein kostenloses Barbecue mit Getränken. Der Gewinner wird auf der Website bekannt gegeben. Stay tuned.
anniversaryAnnouncementTeaser=Mission erfüllt! {0,number,#,###} Rennen mit SAP Sailing Analytics!
anniversaryAnnouncementDescription=3,2,1... Wir gratulieren den Teilnehmern des Rennens {0}. Ihr habt es geschafft die Marke zu durchbrechen. Wir danken euch für euer Vertrauen in SAP Sailing Analytics und hoffen, dass wir noch viele weitere Rennen mit euch machen werden!
anniversaryRaceLinkText=Jubiläumsrennen anzeigen
@@ -6,6 +6,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.moxieapps.gwt.highcharts.client.Axis;
@@ -226,65 +227,46 @@ public class WindChart extends AbstractRaceChart<WindChartSettings> implements R
}
private void updateVisibleSeries() {
List<Series> currentSeries = Arrays.asList(chart.getSeries());
Set<Series> visibleSeries = new HashSet<Series>(currentSeries);
final Set<Series> visibleSeries = new HashSet<Series>(Arrays.asList(chart.getSeries()));
if (preselectFilter != null) {
forceSeriesSelection(visibleSeries, windSourceDirectionSeries);
forceSeriesSelection(visibleSeries, windSourceSpeedSeries);
} else {
if (settings.isShowWindDirectionsSeries()) {
for (Map.Entry<WindSource, Series> e : windSourceDirectionSeries.entrySet()) {
Series series = e.getValue();
if (settings.getWindDirectionSourcesToDisplay().contains(e.getKey().getType())) {
if (!visibleSeries.contains(series)) {
chart.addSeries(series, false, false);
}
series.select(true); // ensures that the checkbox will be ticked
series.setVisible(true); //and that it is actually being rendered
} else {
if (visibleSeries.contains(series)) {
chart.removeSeries(series, false);
}
}
}
} else {
for (Map.Entry<WindSource, Series> e : windSourceDirectionSeries.entrySet()) {
Series series = e.getValue();
if (visibleSeries.contains(series)) {
chart.removeSeries(series, false);
}
}
}
if (settings.isShowWindSpeedSeries()) {
for (Map.Entry<WindSource, Series> e : windSourceSpeedSeries.entrySet()) {
Series series = e.getValue();
if (settings.getWindSpeedSourcesToDisplay().contains(e.getKey().getType())) {
if (!visibleSeries.contains(series)) {
chart.addSeries(series, false, false);
}
series.select(true); // ensures that the checkbox will be ticked
series.setVisible(true); //and that it is actually being rendered
} else {
if (visibleSeries.contains(series)) {
chart.removeSeries(series, false);
}
}
}
} else {
for (Map.Entry<WindSource, Series> e : windSourceSpeedSeries.entrySet()) {
Series series = e.getValue();
if (visibleSeries.contains(series)) {
chart.removeSeries(series, false);
}
}
}
final boolean showDirectionSeries = settings.isShowWindDirectionsSeries();
final Set<WindSourceType> directionSourceTypesToDisplay = settings.getWindDirectionSourcesToDisplay();
updateSeries(visibleSeries, windSourceDirectionSeries, showDirectionSeries, directionSourceTypesToDisplay);
final boolean showSpeedSeries = settings.isShowWindSpeedSeries();
final Set<WindSourceType> speedSourceTypesToDisplay = settings.getWindSpeedSourcesToDisplay();
updateSeries(visibleSeries, windSourceSpeedSeries, showSpeedSeries, speedSourceTypesToDisplay);
}
onResize();
}
private void updateSeries(final Set<Series> visibleSeries, final Map<WindSource, Series> windSourceToSeriesMap,
final boolean showSeries, final Set<WindSourceType> windSourceTypesToDisplay) {
if (showSeries) {
for (Entry<WindSource, Series> entry : windSourceToSeriesMap.entrySet()) {
final Series series = entry.getValue();
if (windSourceTypesToDisplay.contains(entry.getKey().getType())) {
if (!visibleSeries.contains(series)) {
chart.addSeries(series, false, false);
}
} else if (visibleSeries.contains(series)) {
chart.removeSeries(series, false);
}
}
} else {
for (Entry<WindSource, Series> entry : windSourceToSeriesMap.entrySet()) {
final Series series = entry.getValue();
if (visibleSeries.contains(series)) {
chart.removeSeries(series, false);
}
}
}
}
private boolean forceSeriesSelection(Set<Series> visibleSeries, Map<WindSource, Series> toProcess) {
boolean wasInResult = false;
for (Map.Entry<WindSource, Series> e : toProcess.entrySet()) {
@@ -5440,6 +5440,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
dto.defaultRacingProcedureType = configuration.getDefaultRacingProcedureType();
dto.defaultCourseDesignerMode = configuration.getDefaultCourseDesignerMode();
dto.defaultProtestTimeDuration = configuration.getDefaultProtestTimeDuration();
if (configuration.getRRS26Configuration() != null) {
dto.rrs26Configuration = new DeviceConfigurationDTO.RegattaConfigurationDTO.RRS26ConfigurationDTO();
@@ -5497,6 +5498,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
RegattaConfigurationImpl configuration = new RegattaConfigurationImpl();
configuration.setDefaultRacingProcedureType(dto.defaultRacingProcedureType);
configuration.setDefaultCourseDesignerMode(dto.defaultCourseDesignerMode);
configuration.setDefaultProtestTimeDuration(dto.defaultProtestTimeDuration);
if (dto.rrs26Configuration != null) {
RRS26ConfigurationImpl config = new RRS26ConfigurationImpl();
applyGeneralRacingProcedureConfigProperties(dto.rrs26Configuration, config);
@@ -5926,10 +5928,14 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
Util.addAll(competitorToBoatMappingsRegistered.keySet(), competitorsToUnregister);
for (final Entry<CompetitorType, Boat> e : competitorToBoatMappingsRegistered.entrySet()) {
CompetitorType competitor = e.getKey();
if (competitorToBoatMappingsToRegister.get(competitor) == e.getValue()) {
// User wants to map competitor to boat, and that mapping already exists; neither add nor remove this registration but leave as is:
competitorToBoatMappingsToRegister.remove(competitor);
competitorsToUnregister.remove(competitor);
if (competitorToBoatMappingsToRegister.containsKey(competitor)) { // is competitor to be registered?
final Boat boatOfCompetitorToRegister = competitorToBoatMappingsToRegister.get(competitor);
final Boat boatOfRegisteredCompetitor = e.getValue();
if (boatOfCompetitorToRegister == boatOfRegisteredCompetitor) {
// User wants to map competitor to boat, and that mapping already exists; neither add nor remove this registration but leave as is:
competitorToBoatMappingsToRegister.remove(competitor);
competitorsToUnregister.remove(competitor);
}
}
}
return competitorsToUnregister;
@@ -6,6 +6,7 @@ import com.google.gwt.user.client.rpc.IsSerializable;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sse.common.Duration;
public class DeviceConfigurationDTO implements IsSerializable {
@@ -40,6 +41,7 @@ public class DeviceConfigurationDTO implements IsSerializable {
}
public RacingProcedureType defaultRacingProcedureType;
public CourseDesignerMode defaultCourseDesignerMode;
public Duration defaultProtestTimeDuration;
public RRS26ConfigurationDTO rrs26Configuration;
public SWCStartConfigurationDTO swcStartConfiguration;
@@ -15,9 +15,10 @@ import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.serialization.impl.RegattaConfigurationJsonSerializer;
import com.sap.sse.common.impl.MillisecondsDurationImpl;
public class RegattaConfigurationJsonDeserializer implements JsonDeserializer<RegattaConfiguration> {
public static RegattaConfigurationJsonDeserializer create() {
return new RegattaConfigurationJsonDeserializer(RRS26ConfigurationJsonDeserializer.create(), SWCStartConfigurationJsonDeserializer.create(),
GateStartConfigurationJsonDeserializer.create(), ESSConfigurationJsonDeserializer.create(),
@@ -30,8 +31,8 @@ public class RegattaConfigurationJsonDeserializer implements JsonDeserializer<Re
private final ESSConfigurationJsonDeserializer essDeserializer;
private final RacingProcedureConfigurationJsonDeserializer basicDeserializer;
private final LeagueConfigurationJsonDeserializer leagueDeserializer;
public RegattaConfigurationJsonDeserializer(RRS26ConfigurationJsonDeserializer rrs26, SWCStartConfigurationJsonDeserializer swcStart,
public RegattaConfigurationJsonDeserializer(RRS26ConfigurationJsonDeserializer rrs26, SWCStartConfigurationJsonDeserializer swcStart,
GateStartConfigurationJsonDeserializer gateStart, ESSConfigurationJsonDeserializer ess,
RacingProcedureConfigurationJsonDeserializer basicDeserializer, LeagueConfigurationJsonDeserializer leagueDeserializer) {
this.rrs26Deserializer = rrs26;
@@ -41,7 +42,7 @@ public class RegattaConfigurationJsonDeserializer implements JsonDeserializer<Re
this.basicDeserializer = basicDeserializer;
this.leagueDeserializer = leagueDeserializer;
}
@Override
public RegattaConfiguration deserialize(JSONObject object) throws JsonDeserializationException {
RegattaConfigurationImpl configuration = createConfiguration();
@@ -57,7 +58,14 @@ public class RegattaConfigurationJsonDeserializer implements JsonDeserializer<Re
RegattaConfigurationJsonSerializer.FIELD_DEFAULT_COURSE_DESIGNER_MODE).toString());
configuration.setDefaultCourseDesignerMode(mode);
}
if (object.containsKey(RegattaConfigurationJsonSerializer.FIELD_DEFAULT_PROTEST_TIME_DURATION_MILLIS)) {
final Number defaultProtestTimeDurationInMillis = (Number) object.get(
RegattaConfigurationJsonSerializer.FIELD_DEFAULT_PROTEST_TIME_DURATION_MILLIS);
configuration.setDefaultProtestTimeDuration(defaultProtestTimeDurationInMillis == null ? null :
new MillisecondsDurationImpl(defaultProtestTimeDurationInMillis.longValue()));
}
if (object.containsKey(RegattaConfigurationJsonSerializer.FIELD_RRS26)) {
RRS26Configuration rrs26Configuration = rrs26Deserializer.deserialize(
Helpers.getNestedObjectSafe(object, RegattaConfigurationJsonSerializer.FIELD_RRS26));
@@ -71,18 +79,18 @@ public class RegattaConfigurationJsonDeserializer implements JsonDeserializer<Re
}
if (object.containsKey(RegattaConfigurationJsonSerializer.FIELD_GATE_START)) {
GateStartConfiguration gateStartConfiguration =
GateStartConfiguration gateStartConfiguration =
gateStartDeserializer.deserialize(
Helpers.getNestedObjectSafe(object, RegattaConfigurationJsonSerializer.FIELD_GATE_START));
configuration.setGateStartConfiguration(gateStartConfiguration);
}
if (object.containsKey(RegattaConfigurationJsonSerializer.FIELD_ESS)) {
ESSConfiguration essConfiguration = essDeserializer.deserialize(
Helpers.getNestedObjectSafe(object, RegattaConfigurationJsonSerializer.FIELD_ESS));
configuration.setESSConfiguration(essConfiguration);
}
if (object.containsKey(RegattaConfigurationJsonSerializer.FIELD_BASIC)) {
RacingProcedureConfiguration basicConfiguration = basicDeserializer.deserialize(
Helpers.getNestedObjectSafe(object, RegattaConfigurationJsonSerializer.FIELD_BASIC));
@@ -94,10 +102,10 @@ public class RegattaConfigurationJsonDeserializer implements JsonDeserializer<Re
Helpers.getNestedObjectSafe(object, RegattaConfigurationJsonSerializer.FIELD_LEAGUE));
configuration.setLeagueConfiguration(leagueConfiguration);
}
return configuration;
}
protected RegattaConfigurationImpl createConfiguration() {
return new RegattaConfigurationImpl();
}
@@ -14,15 +14,16 @@ public class RegattaConfigurationJsonSerializer implements JsonSerializer<Regatt
RacingProcedureConfigurationJsonSerializer.create(), LeagueConfigurationJsonSerializer.create());
}
public static final Object FIELD_DEFAULT_RACING_PROCEDURE_TYPE = "defaultRacingProcedureType";
public static final Object FIELD_DEFAULT_COURSE_DESIGNER_MODE = "defaultCourseDesignerMode";
public static final String FIELD_DEFAULT_RACING_PROCEDURE_TYPE = "defaultRacingProcedureType";
public static final String FIELD_DEFAULT_COURSE_DESIGNER_MODE = "defaultCourseDesignerMode";
public static final String FIELD_DEFAULT_PROTEST_TIME_DURATION_MILLIS = "defaultProtestTimeDurationMillis";
public static final String FIELD_RRS26 = "rrs26";
public static final String FIELD_SWC_START = "swcStart";
public static final String FIELD_GATE_START = "gateStart";
public static final String FIELD_ESS = "ess";
public static final String FIELD_LEAGUE = "league";
public static final String FIELD_BASIC = "basic";
private final JsonSerializer<RacingProcedureConfiguration> rrs26Serializer;
private final JsonSerializer<RacingProcedureConfiguration> swcStartSerializer;
private final JsonSerializer<RacingProcedureConfiguration> gateStartSerializer;
@@ -47,9 +48,15 @@ public class RegattaConfigurationJsonSerializer implements JsonSerializer<Regatt
if (object.getDefaultRacingProcedureType() != null) {
result.put(FIELD_DEFAULT_RACING_PROCEDURE_TYPE, object.getDefaultRacingProcedureType().name());
}
if (object.getDefaultCourseDesignerMode() != null) {
result.put(FIELD_DEFAULT_COURSE_DESIGNER_MODE, object.getDefaultCourseDesignerMode().name());
}
if (object.getDefaultProtestTimeDuration() != null) {
result.put(FIELD_DEFAULT_PROTEST_TIME_DURATION_MILLIS, object.getDefaultProtestTimeDuration().asMillis());
}
if (object.getRRS26Configuration() != null) {
result.put(FIELD_RRS26, rrs26Serializer.serialize(object.getRRS26Configuration()));
}
@@ -13,6 +13,7 @@ import com.sap.sailing.android.shared.R;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.services.sending.MessagePersistenceManager.MessageRestorer;
import com.sap.sailing.android.shared.services.sending.MessageSenderTask.MessageSendingListener;
import com.sap.sailing.android.shared.util.NotificationHelper;
import com.sap.sailing.android.shared.util.PrefUtils;
import com.sap.sailing.domain.common.racelog.RaceLogServletConstants;
@@ -227,9 +228,17 @@ public class MessageSendingService extends Service implements MessageSendingList
if (persistenceManager.areIntentsDelayed()) {
handleDelayedMessages();
}
startForeground(NotificationHelper.getNotificationId(), NotificationHelper.getNotification(this));
ExLog.i(this, TAG, "Sending Service on Create.");
}
@Override
public void onDestroy() {
stopForeground(true);
ExLog.i(this, TAG, "Message Sending Service is being destroyed.");
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent == null) {
@@ -6,16 +6,15 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.sap.sailing.android.shared.ui.utils.MultiplePreferenceChangeListener;
import com.sap.sailing.android.shared.ui.views.EditSetPreference;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.MultiSelectListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import com.sap.sailing.android.shared.ui.utils.MultiplePreferenceChangeListener;
import com.sap.sailing.android.shared.ui.views.EditSetPreference;
/**
* Created by I074137 on 18.09.13.
@@ -27,7 +26,7 @@ public class BasePreferenceFragment extends PreferenceFragment {
return (T) findPreference(getString(resourceId));
}
protected static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
protected Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object value) {
String stringValue = value.toString();
@@ -53,34 +52,28 @@ public class BasePreferenceFragment extends PreferenceFragment {
}
};
protected static void bindPreferenceSummaryToValue(Preference preference) {
protected void bindPreferenceSummaryToValue(Preference preference) {
addOnPreferenceChangeListener(preference, sBindPreferenceSummaryToValueListener);
sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
PreferenceManager
.getDefaultSharedPreferences(preference.getContext())
.getString(preference.getKey(), ""));
getPreferenceManager().getSharedPreferences().getString(preference.getKey(), ""));
}
protected static void bindPreferenceSummaryToInteger(Preference preference) {
protected void bindPreferenceSummaryToInteger(Preference preference) {
addOnPreferenceChangeListener(preference, sBindPreferenceSummaryToValueListener);
sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
PreferenceManager
.getDefaultSharedPreferences(preference.getContext())
.getInt(preference.getKey(), 0));
getPreferenceManager().getSharedPreferences().getInt(preference.getKey(), 0));
}
protected static void bindPreferenceSummaryToSet(Preference preference) {
protected void bindPreferenceSummaryToSet(Preference preference) {
addOnPreferenceChangeListener(preference, sBindPreferenceSummaryToValueListener);
sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
PreferenceManager
.getDefaultSharedPreferences(preference.getContext())
.getStringSet(preference.getKey(), new HashSet<String>()));
getPreferenceManager().getSharedPreferences().getStringSet(preference.getKey(), new HashSet<String>()));
}
protected static void bindPreferenceToCheckbox(CheckBoxPreference checkboxPreference, final Preference target) {
protected void bindPreferenceToCheckbox(CheckBoxPreference checkboxPreference, final Preference target) {
target.setEnabled(checkboxPreference.isChecked());
addOnPreferenceChangeListener(checkboxPreference, new Preference.OnPreferenceChangeListener() {
@Override
@@ -91,7 +84,7 @@ public class BasePreferenceFragment extends PreferenceFragment {
});
}
protected static void bindPreferenceToListEntry(Preference preference, final String defaultValue) {
protected void bindPreferenceToListEntry(Preference preference, final String defaultValue) {
final ListPreference listPreference = (ListPreference) preference;
if (listPreference.getValue() == null) {
listPreference.setValue(defaultValue);
@@ -111,7 +104,7 @@ public class BasePreferenceFragment extends PreferenceFragment {
});
}
protected static void addOnPreferenceChangeListener(Preference preference, OnPreferenceChangeListener newListener) {
protected void addOnPreferenceChangeListener(Preference preference, OnPreferenceChangeListener newListener) {
OnPreferenceChangeListener oldListener = preference.getOnPreferenceChangeListener();
if (oldListener == null) {
MultiplePreferenceChangeListener multiListener = new MultiplePreferenceChangeListener();
@@ -0,0 +1,56 @@
package com.sap.sailing.android.shared.util;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.app.NotificationCompat;
public class NotificationHelper {
private static final int NOTIFICATION_ID = 13062018;
private static Bitmap largeIcon;
private static CharSequence title;
private static int smallIcon;
public static void prepareNotificationWith(CharSequence appTitle, Bitmap appIcon, int notificationIcon) {
title = appTitle;
largeIcon = appIcon;
smallIcon = notificationIcon;
}
public static Notification getNotification(Context context) {
return getNotification(context, title, "");
}
public static Notification getNotification(Context context, CharSequence customTitle, String content) {
return getNotification(context, customTitle, content, null);
}
public static Notification getNotification(Context context, CharSequence customTitle, String content, PendingIntent intent) {
return getNotification(context, customTitle, content, intent, Notification.COLOR_DEFAULT);
}
public static Notification getNotification(Context context, CharSequence customTitle, String content, PendingIntent intent, int color) {
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
.setContentText(content)
.setContentTitle(customTitle)
.setLargeIcon(largeIcon)
.setSmallIcon(smallIcon)
.setOngoing(true)
.setColor(color)
.setPriority(Notification.PRIORITY_HIGH);
if (intent != null) {
builder.setContentIntent(intent);
}
return builder.build();
}
public static int getNotificationId() {
return NOTIFICATION_ID;
}
}
@@ -15,12 +15,10 @@ import org.json.JSONException;
import org.json.JSONObject;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.hardware.GeomagneticField;
import android.location.Location;
import android.location.LocationListener;
@@ -33,12 +31,12 @@ import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.support.v4.app.NotificationCompat;
import android.widget.Toast;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.services.sending.MessageSendingService;
import com.sap.sailing.android.shared.ui.customviews.GPSQuality;
import com.sap.sailing.android.shared.util.NotificationHelper;
import com.sap.sailing.android.tracking.app.BuildConfig;
import com.sap.sailing.android.tracking.app.R;
import com.sap.sailing.android.tracking.app.ui.activities.TrackingActivity;
@@ -64,7 +62,6 @@ public class TrackingService extends Service implements LocationListener {
private static final int GREAT_DISTANCE = 10;
private static final int NO_DISTANCE = 0;
private NotificationManager notificationManager;
private AppPreferences prefs;
private GPSQualityListener gpsQualityListener;
@@ -127,7 +124,6 @@ public class TrackingService extends Service implements LocationListener {
locationsQueuedBasedOnSendingInterval = new LinkedHashMap<>();
prefs = new AppPreferences(this);
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}
@@ -342,7 +338,7 @@ public class TrackingService extends Service implements LocationListener {
@Override
public void onDestroy() {
stopTracking();
notificationManager.cancel(NOTIFICATION_ID);
stopForeground(false);
Toast.makeText(this, R.string.tracker_stopped, Toast.LENGTH_SHORT).show();
}
@@ -387,16 +383,15 @@ public class TrackingService extends Service implements LocationListener {
private void showNotification() {
Intent intent = new Intent(this, TrackingActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle(getText(R.string.app_name))
.setContentText(getString(R.string.tracking_notification_text, event.name))
.setContentIntent(pi)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setSmallIcon(R.drawable.ic_directions_boat)
.setOngoing(true)
.build();
notificationManager.notify(NOTIFICATION_ID, notification);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
Notification notification = NotificationHelper.getNotification(
this,
getText(R.string.app_name),
getString(R.string.tracking_notification_text, event.name),
pendingIntent
);
startForeground(NotificationHelper.getNotificationId(), notification);
}
public void registerGPSQualityListener(GPSQualityListener listener) {
@@ -6,6 +6,7 @@ import com.sap.sailing.android.shared.data.BaseCheckinData;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.ui.activities.AbstractStartActivity;
import com.sap.sailing.android.shared.util.EulaHelper;
import com.sap.sailing.android.shared.util.NotificationHelper;
import com.sap.sailing.android.tracking.app.R;
import com.sap.sailing.android.tracking.app.ui.fragments.HomeFragment;
import com.sap.sailing.android.tracking.app.utils.AboutHelper;
@@ -19,6 +20,8 @@ import com.sap.sailing.android.tracking.app.valueobjects.MarkCheckinData;
import com.sap.sailing.android.ui.fragments.AbstractHomeFragment;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Menu;
@@ -49,6 +52,11 @@ public class StartActivity extends AbstractStartActivity<CheckinData> {
if (!EulaHelper.with(this).isEulaAccepted()) {
EulaHelper.with(this).showEulaDialog(R.style.AppTheme_AlertDialog);
}
Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
int smallIcon = R.drawable.ic_directions_boat;
CharSequence title = getText(R.string.app_name);
NotificationHelper.prepareNotificationWith(title, largeIcon, smallIcon);
}
@Override
@@ -44,7 +44,9 @@
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyDH-Dwy5yFlyBa2-VUgiZ3qGGUO8M_0MPY" />
<activity android:name=".ui.activities.LoginActivity">
<activity
android:name=".ui.activities.LoginActivity"
android:windowSoftInputMode="adjustPan">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -69,10 +71,11 @@
</activity>
<activity
android:name=".ui.activities.RacingActivity"
android:windowSoftInputMode="adjustNothing" />
android:windowSoftInputMode="adjustPan" />
<activity android:name=".ui.activities.PasswordActivity" />
<activity
android:name=".ui.activities.PreferenceActivity"
android:windowSoftInputMode="adjustPan"
android:theme="@style/PreferenceTheme">
<intent-filter>
<action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
@@ -118,4 +121,4 @@
</intent-filter>
</receiver>
</application>
</manifest>
</manifest>
@@ -536,6 +536,7 @@
<string name="hello_call_error_message">Die App konnte keine Verbindung zu SAP Sailing hergestellt.\nPrüfen Sie bitte, ob Sie eine stabile Mobilfunkverbindung haben.\nWollen Sie es erneut versuchen?</string>
<string name="hello_call_error_positive">Wiederholen</string>
<string name="hello_call_error_negative">Beenden</string>
<string name="hello_call_error_neutral">Server ändern</string>
<string name="competitor_merge_error_message">Dieser Teilnehmer wurde an einem anderen Gerät verändert und hat überschneidende Änderungen. Bitte stellen Sie sicher, dass die Daten korrekt sind.</string>
@@ -115,6 +115,9 @@
<bool name="preference_allow_edit_race_factor_default">true</bool>
<string name="preference_protest_time_duration_key">protestTimeDuration</string>
<integer name="preference_protest_time_duration_default">90</integer>
<string name="preference_protest_time_duration_custom_key">protestTimeDurationCustom</string>
<string name="preference_protest_time_duration_custom_editable_key">protestTimeDurationCustomEditable</string>
<bool name="preference_protest_time_duration_custom_editable_default">true</bool>
<string name="preference_allow_demo_key" translatable="false">allow_demo</string>
<bool name="preference_allow_demo_default">false</bool>
@@ -429,7 +429,7 @@
<string name="use_previous_course_dialog_message">Use previously published course design?</string>
<string name="please_enter_valid_number">Please enter a valid number</string>
<string name="please_enter_valid_pathfinder">Please enter a valid pathfinder</string>
<string name="error_scanning_qr">Error scanning QR code (%i)</string>
<string name="error_scanning_qr">Error scanning QR code (%d)</string>
<string name="error_scanning_qr_malformed">Malformed url</string>
<string name="marks_w_placeholder">Marks: %s</string>
<string name="error_no_course_to_copy">No course available to copy</string>
@@ -565,6 +565,7 @@
<string name="hello_call_error_message">The App couldn\'t establish a connection to SAP Sailing.\nPlease check if you have a stable mobile connection.\nDo you want to retry?</string>
<string name="hello_call_error_positive">Retry</string>
<string name="hello_call_error_negative">Exit</string>
<string name="hello_call_error_neutral">Change Server</string>
<string name="competitor_merge_error_message">This competitor was changed from another device and you have changed the same data. Please be sure, that this data is correct now.</string>
@@ -32,6 +32,13 @@
<item name="colorPrimary">@color/light_colorPrimary</item>
<item name="colorPrimaryDark">@color/light_colorPrimaryDark</item>
<item name="colorAccent">@color/light_colorAccent</item>
<item name="android:alertDialogTheme">@style/PreferenceDialogTheme</item>
</style>
<style name="PreferenceDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:windowMinWidthMajor">50%</item>
<item name="android:windowMinWidthMinor">95%</item>
<item name="android:windowSoftInputMode">adjustPan</item>
</style>
<style name="ToolBarStyle" parent="@style/ThemeOverlay.AppCompat.Dark">
@@ -43,7 +50,7 @@
<item name="titleTextStyle">@style/RacingToolBarTitle</item>
<item name="android:titleTextStyle">@style/RacingToolBarTitle</item>
</style>
<style name="DrawerButton" parent="Widget.AppCompat.DrawerArrowToggle">
<item name="thickness">4dp</item>
<!--
@@ -64,4 +71,4 @@
<item name="android:textSize">@dimen/textSize_40</item>
</style>
</resources>
</resources>
@@ -5,16 +5,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.preference.PreferenceManager;
import android.provider.Settings.Secure;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import com.google.android.gms.maps.model.LatLng;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
@@ -29,6 +19,16 @@ import com.sap.sailing.racecommittee.app.domain.coursedesign.NumberOfRounds;
import com.sap.sailing.racecommittee.app.domain.coursedesign.TrapezoidCourseLayouts;
import com.sap.sailing.racecommittee.app.domain.coursedesign.WindWardLeeWardCourseLayouts;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.preference.PreferenceManager;
import android.provider.Settings.Secure;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
/**
* Wrapper for {@link SharedPreferences} for all hidden and non-hidden preferences and state variables.
*/
@@ -497,13 +497,32 @@ public class AppPreferences {
.getInteger(R.integer.preference_dependent_races_offset_default));
}
public int getProtestTimeDuration() {
public int getProtestTimeDurationInMinutes() {
return helper.getInt(context.getString(R.string.preference_protest_time_duration_key), context.getResources()
.getInteger(R.integer.preference_protest_time_duration_default));
}
public void setProtestTimeDuration(int value) {
helper.getEditor().putInt(context.getString(R.string.preference_protest_time_duration_key), value).commit();
public int getProtestTimeDurationInMinutesCustom() {
return helper.getInt(context.getString(R.string.preference_protest_time_duration_custom_key), -1);
}
public boolean isDefaultProtestTimeCustomEditable() {
return helper.getBoolean(context.getString(R.string.preference_protest_time_duration_custom_editable_key),
context.getResources().getBoolean(R.bool.preference_protest_time_duration_custom_editable_default));
}
public void setDefaultProtestTimeDurationInMinutes(int protestTimeInMinutes) {
helper.getEditor().putInt(context.getString(R.string.preference_protest_time_duration_key), protestTimeInMinutes).commit();
}
public void setDefaultProtestTimeDurationInMinutesCustom(int protestTimeInMinutest) {
helper.getEditor().putInt(context.getString(R.string.preference_protest_time_duration_custom_key), protestTimeInMinutest).commit();
}
public void setDefaultProtestTimeDurationInMinutesCustomEditable(boolean editable) {
helper.getEditor()
.putBoolean(context.getString(R.string.preference_protest_time_duration_custom_editable_key), editable)
.commit();
}
public String getTheme() {
@@ -21,6 +21,7 @@ import com.sap.sailing.domain.base.configuration.procedures.RRS26Configuration;
import com.sap.sailing.domain.base.configuration.procedures.SWCStartConfiguration;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.racecommittee.app.AppPreferences;
import com.sap.sse.common.Duration;
public class PreferencesRegattaConfigurationLoader implements ConfigurationLoader<RegattaConfiguration> {
@@ -48,6 +49,7 @@ public class PreferencesRegattaConfigurationLoader implements ConfigurationLoade
configuration.setDefaultRacingProcedureType(preferences.getDefaultRacingProcedureType());
configuration.setDefaultCourseDesignerMode(preferences.getDefaultCourseDesignerMode());
configuration.setDefaultProtestTimeDuration(Duration.ONE_MINUTE.times(preferences.getProtestTimeDurationInMinutes()));
RRS26ConfigurationImpl rrs26 = new RRS26ConfigurationImpl();
rrs26.setClassFlag(preferences.getRacingProcedureClassFlag(RacingProcedureType.RRS26));
@@ -104,6 +106,13 @@ public class PreferencesRegattaConfigurationLoader implements ConfigurationLoade
preferences.setDefaultCourseDesignerMode(configuration.getDefaultCourseDesignerMode());
}
if (configuration.getDefaultProtestTimeDuration() != null) {
preferences.setDefaultProtestTimeDurationInMinutes((int) configuration.getDefaultProtestTimeDuration().asMinutes());
preferences.setDefaultProtestTimeDurationInMinutesCustomEditable(false);
} else {
preferences.setDefaultProtestTimeDurationInMinutesCustomEditable(true);
}
if (configuration.getRRS26Configuration() != null) {
RRS26Configuration config = configuration.getRRS26Configuration();
storeRacingProcedureConfiguration(RacingProcedureType.RRS26, config);
@@ -9,6 +9,7 @@ import java.util.Map.Entry;
import java.util.Set;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.NotificationHelper;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogChangedVisitor;
@@ -33,6 +34,7 @@ import com.sap.sse.common.impl.MillisecondsTimePoint;
import android.annotation.TargetApi;
import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
@@ -60,8 +62,6 @@ public class RaceStateService extends Service {
}
}
private final static int NOTIFICATION_ID = 42;
private final IBinder mBinder = new RaceStateServiceBinder();
private AlarmManager alarmManager;
@@ -75,9 +75,6 @@ public class RaceStateService extends Service {
private Map<String, List<Pair<PendingIntent, RaceStateEvents>>> managedIntents;
private NotificationManager notificationManager;
private NotificationCompat.Builder notificationBuilder;
@Override
public void onCreate() {
this.alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
@@ -87,26 +84,22 @@ public class RaceStateService extends Service {
this.registeredStateEventSchedulers = new HashMap<>();
this.managedIntents = new HashMap<>();
notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
setupNotificationBuilder();
super.onCreate();
Notification notification = setupNotification(null);
startForeground(NotificationHelper.getNotificationId(), notification);
ExLog.i(this, TAG, "Started.");
}
private void setupNotificationBuilder() {
private Notification setupNotification(String customContent) {
Intent launcherIntent = new Intent(this, LoginActivity.class);
launcherIntent.setAction(Intent.ACTION_MAIN);
launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, launcherIntent, 0);
notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_boat_white_24dp)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setContentTitle(getText(R.string.service_info))
.setContentText(getString(R.string.service_text_no_races))
.setContentIntent(contentIntent)
.setColor(getResources().getColor(R.color.constant_sap_blue_1))
.setOngoing(true);
CharSequence title = getText(R.string.service_info);
String content = customContent != null ? customContent : getString(R.string.service_text_no_races);
int color = getResources().getColor(R.color.constant_sap_blue_1);
return NotificationHelper.getNotification(this, title, content, contentIntent, color);
}
@Override
@@ -130,7 +123,7 @@ public class RaceStateService extends Service {
@Override
public void onDestroy() {
unregisterAllRaces();
stopForeground(false);
super.onDestroy();
}
@@ -282,10 +275,9 @@ public class RaceStateService extends Service {
private void updateNotification() {
int numRaces = managedIntents.keySet().size();
notificationManager.notify(NOTIFICATION_ID, notificationBuilder
.setContentText(getString(R.string.service_text_num_races, numRaces))
.build());
startForeground(NOTIFICATION_ID, notificationBuilder.build());
String content = getString(R.string.service_text_num_races, numRaces);
Notification notification = setupNotification(content);
startForeground(NotificationHelper.getNotificationId(), notification);
}
public void registerRace(ManagedRace race) {
@@ -6,28 +6,8 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.UUID;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.Button;
import android.widget.Toast;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.sap.sailing.android.shared.logging.ExLog;
@@ -35,6 +15,7 @@ import com.sap.sailing.android.shared.util.AppUtils;
import com.sap.sailing.android.shared.util.BroadcastManager;
import com.sap.sailing.android.shared.util.EulaHelper;
import com.sap.sailing.android.shared.util.NetworkHelper;
import com.sap.sailing.android.shared.util.NotificationHelper;
import com.sap.sailing.android.shared.util.ViewHelper;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.EventBase;
@@ -66,6 +47,28 @@ import com.sap.sailing.racecommittee.app.utils.QRHelper;
import com.sap.sailing.racecommittee.app.utils.StringHelper;
import com.sap.sailing.racecommittee.app.utils.autoupdate.AutoUpdater;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.Button;
import android.widget.Toast;
public class LoginActivity extends BaseActivity
implements EventSelectedListenerHost, CourseAreaSelectedListenerHost, PositionSelectedListenerHost, DialogListenerHost.DialogResultListener {
@@ -334,6 +337,11 @@ public class LoginActivity extends BaseActivity
if (!EulaHelper.with(this).isEulaAccepted()) {
EulaHelper.with(this).showEulaDialog(R.style.AppTheme_AlertDialog);
}
Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
int smallIcon = R.drawable.ic_boat_white_24dp;
CharSequence title = getText(R.string.app_name);
NotificationHelper.prepareNotificationWith(title, largeIcon, smallIcon);
}
@Override
@@ -407,6 +415,7 @@ public class LoginActivity extends BaseActivity
public void onLoadFailed(Exception reason) {
dismissProgressSpinner();
preferences.setDefaultProtestTimeDurationInMinutesCustomEditable(true);
if (reason instanceof FileNotFoundException) {
Toast.makeText(getApplicationContext(), getString(R.string.loading_configuration_not_found), Toast.LENGTH_LONG).show();
ExLog.w(LoginActivity.this, TAG, String.format("There seems to be no configuration for this device: %s", reason.toString()));
@@ -513,11 +522,11 @@ public class LoginActivity extends BaseActivity
animatorSet.start();
}
private ObjectAnimator getAlphaAnimator(@NonNull Object target) {
private ObjectAnimator getAlphaAnimator(@NonNull View target) {
return ObjectAnimator.ofFloat(target, "alpha", 0f, 1f);
}
private ObjectAnimator getAlphaRevAnimator(@NonNull Object target) {
private ObjectAnimator getAlphaRevAnimator(@NonNull View target) {
return ObjectAnimator.ofFloat(target, "alpha", 1f, 0f);
}
@@ -396,6 +396,12 @@ public class LoginBackdrop extends Fragment implements BackPressListener {
getActivity().finish();
}
});
builder.setNeutralButton(R.string.hello_call_error_neutral, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
BroadcastManager.getInstance(getActivity()).addIntent(new Intent(AppConstants.INTENT_ACTION_SHOW_ONBOARDING));
}
});
builder.setCancelable(false);
builder.show();
}
@@ -5,6 +5,28 @@ import java.util.Calendar;
import java.util.Date;
import java.util.List;
import com.sap.sailing.android.shared.util.BitmapHelper;
import com.sap.sailing.android.shared.util.BroadcastManager;
import com.sap.sailing.android.shared.util.ScreenHelper;
import com.sap.sailing.android.shared.util.ViewHelper;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishedTimeFinder;
import com.sap.sailing.domain.base.racegroup.RaceGroupSeriesFleet;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.AppPreferences;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.data.DataManager;
import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.racecommittee.app.utils.PreferenceHelper;
import com.sap.sailing.racecommittee.app.utils.ThemeHelper;
import com.sap.sailing.racecommittee.app.utils.TimeUtils;
import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.TimeRange;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.common.impl.TimeRangeImpl;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.ContextWrapper;
@@ -27,27 +49,6 @@ import android.widget.ListView;
import android.widget.TextView;
import android.widget.TimePicker;
import com.sap.sailing.android.shared.util.BitmapHelper;
import com.sap.sailing.android.shared.util.BroadcastManager;
import com.sap.sailing.android.shared.util.ScreenHelper;
import com.sap.sailing.android.shared.util.ViewHelper;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishedTimeFinder;
import com.sap.sailing.domain.base.racegroup.RaceGroupSeriesFleet;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.AppPreferences;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.data.DataManager;
import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.racecommittee.app.utils.ThemeHelper;
import com.sap.sailing.racecommittee.app.utils.TimeUtils;
import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.TimeRange;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.common.impl.TimeRangeImpl;
public class ProtestTimeDialogFragment extends AttachedDialogFragment implements View.OnClickListener {
protected final static int MOVE_DOWN = -1;
@@ -66,6 +67,7 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
private View mHome;
private Button mChoose;
private AppPreferences mPreferences;
private Integer mDuration = null;
public ProtestTimeDialogFragment() {
races = new ArrayList<>();
@@ -100,7 +102,6 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mPreferences = AppPreferences.on(getActivity());
View layout = super.onCreateView(inflater, container, savedInstanceState);
if (customView == null) {
layout = inflater.inflate(R.layout.protest_time_fragment, container, false);
@@ -210,7 +211,6 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
}
private View setupView() {
mPreferences = AppPreferences.on(getActivity());
LayoutInflater inflater = LayoutInflater.from(getActivity());
View view = inflater.inflate(R.layout.protest_time_dialog, null);
mRacesList = (ListView) view.findViewById(R.id.protest_time_races_list);
@@ -296,11 +296,21 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
}
ReadonlyDataManager manager = DataManager.create(getActivity());
ArrayList<String> raceIds = args.getStringArrayList(ARGS_RACE_IDS);
String raceGroup = null;
if (raceIds != null) {
for (String id : raceIds) {
races.add(manager.getDataStore().getRace(id));
ManagedRace managedRace = manager.getDataStore().getRace(id);
if (raceGroup == null) {
raceGroup = managedRace.getRaceGroup().getName();
}
races.add(managedRace);
}
}
if (raceGroup != null) {
mPreferences = AppPreferences.on(getActivity(), PreferenceHelper.getRegattaPrefFileName(raceGroup));
} else {
mPreferences = AppPreferences.on(getActivity());
}
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
@@ -309,7 +319,7 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
TimePoint startTime = TimeUtils.getTime(mTimePicker);
TimePoint now = MillisecondsTimePoint.now();
for (ManagedRace race : selectedRaces) {
Duration duration = Duration.ONE_MINUTE.times(AppPreferences.on(getActivity()).getProtestTimeDuration());
Duration duration = Duration.ONE_MINUTE.times(AppPreferences.on(getActivity()).getProtestTimeDurationInMinutes());
TimeRange protestTime = new TimeRangeImpl(startTime, startTime.plus(duration));
race.getState().setProtestTime(now, protestTime);
}
@@ -391,13 +401,21 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
}
private void updateProtestRange() {
int duration = mPreferences.getProtestTimeDuration();
if (mDuration == null) {
mDuration = mPreferences.getProtestTimeDurationInMinutes();
if (mPreferences.isDefaultProtestTimeCustomEditable()) {
int custom = mPreferences.getProtestTimeDurationInMinutesCustom();
if (custom >= 0) {
mDuration = custom;
}
}
}
if (mProtestDuration != null) {
mProtestDuration.setText(getString(R.string.protest_duration, duration));
mProtestDuration.setText(getString(R.string.protest_duration, mDuration));
}
if (mProtestEndTime != null) {
TimePoint startTime = TimeUtils.getTime(mTimePicker);
TimePoint endTime = startTime.plus(Duration.ONE_MINUTE.times(duration));
TimePoint endTime = startTime.plus(Duration.ONE_MINUTE.times(mDuration));
mProtestEndTime.setText(getString(R.string.protest_end_time, TimeUtils.formatTime(endTime)));
}
}
@@ -440,7 +458,7 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
public void onClick(View v) {
FrameLayout layout = (FrameLayout) LayoutInflater.from(v.getContext()).inflate(R.layout.protest_duration, null);
final EditText duration = (EditText) layout.findViewById(R.id.protest_duration);
duration.setText(String.valueOf(mPreferences.getProtestTimeDuration()));
duration.setText(String.valueOf(mDuration));
duration.setSelection(duration.length());
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextWrapper(v.getContext()), R.style.AppTheme_AlertDialog);
builder.setTitle(v.getContext().getString(R.string.protest_duration_dialog_title));
@@ -448,8 +466,10 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int value = Integer.parseInt(duration.getText().toString());
mPreferences.setProtestTimeDuration(value);
mDuration = Integer.parseInt(duration.getText().toString());
if (mPreferences.isDefaultProtestTimeCustomEditable()) {
mPreferences.setDefaultProtestTimeDurationInMinutesCustom(mDuration);
}
updateProtestRange();
}
});
@@ -457,4 +477,4 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
builder.show();
}
}
}
}
@@ -1,11 +1,11 @@
package com.sap.sailing.racecommittee.app.ui.fragments.preference;
import android.os.Bundle;
import com.sap.sailing.android.shared.ui.fragments.preference.BasePreferenceFragment;
import com.sap.sailing.android.shared.ui.views.EditSetPreference;
import com.sap.sailing.racecommittee.app.R;
import android.os.Bundle;
public class CourseDesignerPreferenceFragment extends BasePreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -5,12 +5,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Set;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.MultiSelectListPreference;
import android.support.annotation.StringRes;
import android.text.TextUtils;
import com.sap.sailing.android.shared.ui.fragments.preference.BasePreferenceFragment;
import com.sap.sailing.domain.base.configuration.RegattaConfiguration;
import com.sap.sailing.domain.common.CourseDesignerMode;
@@ -19,6 +13,12 @@ import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.ui.activities.PreferenceActivity;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.MultiSelectListPreference;
import android.support.annotation.StringRes;
import android.text.TextUtils;
/**
* <p>
* This preference fragment can be redirected to display the {@link RegattaConfiguration} of a specific regatta.
@@ -38,15 +38,6 @@ public class RegattaPreferenceFragment extends BasePreferenceFragment {
}
addPreferencesFromResource(R.xml.preference_regatta_defaults);
bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_rrs26_classflag_key));
bindPreferenceSummaryToSet(findPreference(R.string.preference_racing_procedure_rrs26_startmode_flags_key));
bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_swc_classflag_key));
bindPreferenceSummaryToSet(findPreference(R.string.preference_racing_procedure_swc_startmode_flags_key));
bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_gatestart_classflag_key));
bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_ess_classflag_key));
bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_basic_classflag_key));
bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_league_classflag_key));
setupGeneral();
setupRRS26();
setupSWC();
@@ -56,32 +47,6 @@ public class RegattaPreferenceFragment extends BasePreferenceFragment {
setupLeague();
}
private void setupRRS26() {
setupStartmodeFlagsList(R.string.preference_racing_procedure_rrs26_startmode_flags_key);
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_rrs26_classflag_key));
}
private void setupSWC() {
setupStartmodeFlagsList(R.string.preference_racing_procedure_swc_startmode_flags_key);
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_swc_classflag_key));
}
private void setupGateStart() {
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_gatestart_classflag_key));
}
private void setupESS() {
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_ess_classflag_key));
}
private void setupBasic() {
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_basic_classflag_key));
}
private void setupLeague() {
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_league_classflag_key));
}
private void setupGeneral() {
setupRacingProcedureTypePreference();
setupCourseDesignerTypePreference();
@@ -89,6 +54,42 @@ public class RegattaPreferenceFragment extends BasePreferenceFragment {
setupProtestTimePreference();
}
private void setupRRS26() {
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_rrs26_classflag_key));
bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_rrs26_classflag_key));
setupStartmodeFlagsList(R.string.preference_racing_procedure_rrs26_startmode_flags_key);
bindPreferenceSummaryToSet(findPreference(R.string.preference_racing_procedure_rrs26_startmode_flags_key));
}
private void setupSWC() {
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_swc_classflag_key));
bindPreferenceSummaryToSet(findPreference(R.string.preference_racing_procedure_swc_startmode_flags_key));
setupStartmodeFlagsList(R.string.preference_racing_procedure_swc_startmode_flags_key);
bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_swc_classflag_key));
}
private void setupGateStart() {
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_gatestart_classflag_key));
bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_gatestart_classflag_key));
}
private void setupESS() {
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_ess_classflag_key));
bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_ess_classflag_key));
}
private void setupBasic() {
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_basic_classflag_key));
bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_basic_classflag_key));
}
private void setupLeague() {
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_league_classflag_key));
bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_league_classflag_key));
}
private void setupRacingProcedureTypePreference() {
final ListPreference startProcedurePreference = findPreference(R.string.preference_racing_procedure_override_key);