# revamped the configuration system to support remote configuration of racing procedures

This commit is contained in:
Lukas Niemeier committed 2013-11-25 00:01:25 +01:00
1 parent d65519922c
commit 773670d608
52 files changed
+1289 -358

No files matched your search

@@ -1,5 +1,8 @@
package com.sap.sailing.domain.common.racelog;
import java.util.ArrayList;
import java.util.List;
public enum Flags {
NONE,
ALPHA,
@@ -20,5 +23,15 @@ public enum Flags {
AP,
ESSONE,
ESSTWO,
ESSTHREE
ESSTHREE;
public static Flags[] validValues() {
List<Flags> validValues = new ArrayList<Flags>();
for (Flags flag : values()) {
if (flag != NONE) {
validValues.add(flag);
}
}
return validValues.toArray(new Flags[validValues.size()]);
}
}
@@ -10,7 +10,10 @@ import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure;
/**
* Aggregate interface holding configuration options for all {@link RacingProcedure}s.
*/
public interface RacingProceduresConfiguration extends RRS26Configuration, GateStartConfiguration, ESSConfiguration,
Serializable {
public interface RacingProceduresConfiguration extends Serializable {
RRS26Configuration getRRS26Configuration();
GateStartConfiguration getGateStartConfiguration();
ESSConfiguration getESSConfiguration();
}
@@ -0,0 +1,14 @@
package com.sap.sailing.domain.base.configuration.impl;
import com.sap.sailing.domain.base.configuration.procedures.ESSConfiguration;
public class ESSConfigurationImpl extends RacingProcedureConfigurationImpl implements ESSConfiguration {
private static final long serialVersionUID = 5406098147408723197L;
protected ESSConfiguration copy() {
ESSConfigurationImpl copy = (ESSConfigurationImpl) super.copy(new ESSConfigurationImpl());
return copy;
}
}
@@ -0,0 +1,14 @@
package com.sap.sailing.domain.base.configuration.impl;
import com.sap.sailing.domain.base.configuration.procedures.GateStartConfiguration;
public class GateStartConfigurationImpl extends RacingProcedureConfigurationImpl implements GateStartConfiguration {
private static final long serialVersionUID = 1862408542829215027L;
protected GateStartConfiguration copy() {
GateStartConfigurationImpl copy = (GateStartConfigurationImpl) super.copy(new GateStartConfigurationImpl());
return copy;
}
}
@@ -0,0 +1,30 @@
package com.sap.sailing.domain.base.configuration.impl;
import java.util.List;
import com.sap.sailing.domain.base.configuration.procedures.RRS26Configuration;
import com.sap.sailing.domain.common.racelog.Flags;
public class RRS26ConfigurationImpl extends RacingProcedureConfigurationImpl implements
RRS26Configuration {
private static final long serialVersionUID = 260941807346644026L;
private List<Flags> startModeFlags;
@Override
public List<Flags> getStartModeFlags() {
return startModeFlags;
}
public void setStartModeFlags(List<Flags> flags) {
this.startModeFlags = flags;
}
protected RRS26Configuration copy() {
RRS26ConfigurationImpl copy = (RRS26ConfigurationImpl) super.copy(new RRS26ConfigurationImpl());
copy.setStartModeFlags(startModeFlags);
return copy;
}
}
@@ -0,0 +1,40 @@
package com.sap.sailing.domain.base.configuration.impl;
import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration;
import com.sap.sailing.domain.common.racelog.Flags;
public class RacingProcedureConfigurationImpl implements RacingProcedureConfiguration {
private static final long serialVersionUID = 8501755084811977792L;
private Flags classFlag;
private Boolean hasInidividualRecall;@Override
public Flags getClassFlag() {
return classFlag;
}
public void setClassFlag(Flags classFlag) {
this.classFlag = classFlag;
}
@Override
public Boolean hasInidividualRecall() {
return hasInidividualRecall;
}
public void setHasInidividualRecall(Boolean hasInidividualRecall) {
this.hasInidividualRecall = hasInidividualRecall;
}
protected RacingProcedureConfiguration copy() {
return copy(new RacingProcedureConfigurationImpl());
}
protected RacingProcedureConfiguration copy(RacingProcedureConfigurationImpl target) {
target.setClassFlag(this.getClassFlag());
target.setHasInidividualRecall(this.hasInidividualRecall());
return target;
}
}
@@ -1,55 +1,50 @@
package com.sap.sailing.domain.base.configuration.impl;
import java.util.List;
import com.sap.sailing.domain.base.configuration.RacingProceduresConfiguration;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.domain.base.configuration.procedures.ESSConfiguration;
import com.sap.sailing.domain.base.configuration.procedures.GateStartConfiguration;
import com.sap.sailing.domain.base.configuration.procedures.RRS26Configuration;
public class RacingProceduresConfigurationImpl implements RacingProceduresConfiguration {
private static final long serialVersionUID = 8501755084811977792L;
private Flags classFlag;
private Boolean hasInidividualRecall;
private List<Flags> startModeFlags;
// GENERAL
private RRS26Configuration rrs26Configuration;
private GateStartConfiguration gateStartConfiguration;
private ESSConfiguration essConfiguration;
@Override
public Flags getClassFlag() {
return classFlag;
public RRS26Configuration getRRS26Configuration() {
return rrs26Configuration;
}
public void setClassFlag(Flags classFlag) {
this.classFlag = classFlag;
public void setRRS26Configuration(RRS26Configuration rrs26Configuration) {
this.rrs26Configuration = rrs26Configuration;
}
@Override
public Boolean hasInidividualRecall() {
return hasInidividualRecall;
public GateStartConfiguration getGateStartConfiguration() {
return gateStartConfiguration;
}
public void setHasInidividualRecall(Boolean hasInidividualRecall) {
this.hasInidividualRecall = hasInidividualRecall;
public void setGateStartConfiguration(GateStartConfiguration gateStartConfiguration) {
this.gateStartConfiguration = gateStartConfiguration;
}
// RRS26
@Override
public List<Flags> getStartModeFlags() {
return startModeFlags;
public ESSConfiguration getESSConfiguration() {
return essConfiguration;
}
public void setStartModeFlags(List<Flags> flags) {
this.startModeFlags = flags;
public void setESSConfiguration(ESSConfiguration essConfiguration) {
this.essConfiguration = essConfiguration;
}
protected RacingProceduresConfiguration copy() {
RacingProceduresConfigurationImpl copy = new RacingProceduresConfigurationImpl();
copy.setClassFlag(classFlag);
copy.setHasInidividualRecall(hasInidividualRecall);
copy.setStartModeFlags(startModeFlags);
copy.setRRS26Configuration(rrs26Configuration);
copy.setGateStartConfiguration(gateStartConfiguration);
copy.setESSConfiguration(essConfiguration);
return copy;
}
@@ -3,9 +3,11 @@ package com.sap.sailing.domain.base.racegroup;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.configuration.RacingProceduresConfiguration;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.Named;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.domain.racelog.state.racingprocedure.RacingProcedure;
/**
* A {@link RaceGroup} is an abstract representation of a set of races managed in fleets and series.
@@ -44,12 +46,17 @@ public interface RaceGroup extends Named {
public Iterable<SeriesWithRows> getSeries();
/**
* Gets the default {@link RacingProcedureType} of this RaceGroup's races.
* Gets the default {@link RacingProcedureType} of this {@link RaceGroup}'s races.
*/
public RacingProcedureType getDefaultRacingProcedureType();
/**
* Gets the default {@link CourseDesignerMode} of this RaceGroup's races.
* Gets the default {@link CourseDesignerMode} of this {@link RaceGroup}'s races.
*/
public CourseDesignerMode getDefaultCourseDesignerMode();
/**
* Gets configuration objects for {@link RacingProcedure}s of this {@link RaceGroup}'s races.
*/
public RacingProceduresConfiguration getRacingProceduresConfiguration();
}
@@ -2,6 +2,7 @@ package com.sap.sailing.domain.base.racegroup.impl;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.configuration.RacingProceduresConfiguration;
import com.sap.sailing.domain.base.racegroup.RaceGroup;
import com.sap.sailing.domain.base.racegroup.SeriesWithRows;
import com.sap.sailing.domain.common.CourseDesignerMode;
@@ -17,15 +18,18 @@ public class RaceGroupImpl extends NamedImpl implements RaceGroup {
private final Iterable<SeriesWithRows> series;
private final RacingProcedureType defaultRacingProcedureType;
private final CourseDesignerMode defaultCourseDesignerMode;
private final RacingProceduresConfiguration proceduresConfiguration;
public RaceGroupImpl(String name, BoatClass boatClass, CourseArea courseArea, Iterable<SeriesWithRows> series,
RacingProcedureType defaultRacingProcedureType, CourseDesignerMode defaultCourseDesignerMode) {
RacingProcedureType defaultRacingProcedureType, CourseDesignerMode defaultCourseDesignerMode,
RacingProceduresConfiguration proceduresConfiguration) {
super(name);
this.boatClass = boatClass;
this.courseArea = courseArea;
this.series = series;
this.defaultRacingProcedureType = defaultRacingProcedureType;
this.defaultCourseDesignerMode = defaultCourseDesignerMode;
this.proceduresConfiguration = proceduresConfiguration;
}
public CourseArea getDefaultCourseArea() {
@@ -50,4 +54,9 @@ public class RaceGroupImpl extends NamedImpl implements RaceGroup {
return defaultCourseDesignerMode;
}
@Override
public RacingProceduresConfiguration getRacingProceduresConfiguration() {
return proceduresConfiguration;
}
}
@@ -27,11 +27,11 @@ public class ReadonlyRacingProcedureFactory implements RacingProcedureFactory {
RacingProceduresConfiguration loadedConfiguration = configuration.load();
switch (type) {
case ESS:
return new ESSRacingProcedureImpl(raceLog, author, factory, loadedConfiguration);
return new ESSRacingProcedureImpl(raceLog, author, factory, loadedConfiguration.getESSConfiguration());
case GateStart:
return new GateStartRacingProcedureImpl(raceLog, author, factory, loadedConfiguration);
return new GateStartRacingProcedureImpl(raceLog, author, factory, loadedConfiguration.getGateStartConfiguration());
case RRS26:
return new RRS26RacingProcedureImpl(raceLog, author, factory, loadedConfiguration);
return new RRS26RacingProcedureImpl(raceLog, author, factory, loadedConfiguration.getRRS26Configuration());
default:
throw new UnsupportedOperationException("Unknown racing procedure " + type.toString());
}
@@ -27,7 +27,6 @@ import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.ColumnSortEvent;
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
@@ -417,26 +416,14 @@ public class RegattaRaceStatesComponent extends SimplePanel implements Component
raceCourseColumn.setFieldUpdater(new FieldUpdater<RegattaOverviewEntryDTO, SafeHtml>() {
@Override
public void update(int index, RegattaOverviewEntryDTO object, SafeHtml value) {
/*RaceCourseDTO courseDTO = object.raceInfo.lastCourseDesign;
RaceCourseDTO courseDTO = object.raceInfo.lastCourseDesign;
if (courseDTO != null && courseDTO.waypoints.size() > 0) {
DialogBox courseViewDialogBox = createCourseViewDialogBox(object.raceInfo);
courseViewDialogBox.center();
courseViewDialogBox.setGlassEnabled(true);
courseViewDialogBox.setAnimationEnabled(true);
courseViewDialogBox.show();
} */
sailingService.fakeNewStartTime(object, new Date(), new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
}
@Override
public void onFailure(Throwable caught) {
}
});
}
});
raceCourseColumn.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
@@ -18,12 +18,12 @@ import com.sap.sailing.server.gateway.serialization.impl.DeviceConfigurationJson
public class DeviceConfigurationJsonDeserializer implements JsonDeserializer<DeviceConfiguration> {
public static DeviceConfigurationJsonDeserializer create() {
return new DeviceConfigurationJsonDeserializer(new RacingProceduresConfigurationJsonDeserializer());
return new DeviceConfigurationJsonDeserializer(RacingProceduresConfigurationJsonDeserializer.create());
}
private final JsonDeserializer<? extends RacingProceduresConfiguration> proceduresDeserializer;
private final JsonDeserializer<RacingProceduresConfiguration> proceduresDeserializer;
public DeviceConfigurationJsonDeserializer(JsonDeserializer<? extends RacingProceduresConfiguration> proceduresDeserializer) {
public DeviceConfigurationJsonDeserializer(JsonDeserializer<RacingProceduresConfiguration> proceduresDeserializer) {
this.proceduresDeserializer = proceduresDeserializer;
}
@@ -33,15 +33,16 @@ public class DeviceConfigurationJsonDeserializer implements JsonDeserializer<Dev
RacingProceduresConfiguration proceduresConfiguration = null;
if (object.containsKey(DeviceConfigurationJsonSerializer.FIELD_PROCEDURES_CONFIGURATION)) {
JSONObject proceduresObject =
Helpers.getNestedObjectSafe(object, DeviceConfigurationJsonSerializer.FIELD_PROCEDURES_CONFIGURATION);
JSONObject proceduresObject = Helpers.getNestedObjectSafe(object,
DeviceConfigurationJsonSerializer.FIELD_PROCEDURES_CONFIGURATION);
proceduresConfiguration = proceduresDeserializer.deserialize(proceduresObject);
}
DeviceConfigurationImpl configuration = createConfiguration(proceduresConfiguration);
if (object.containsKey(DeviceConfigurationJsonSerializer.FIELD_COURSE_AREA_NAMES)) {
JSONArray courseAreaNames = Helpers.getNestedArraySafe(object, DeviceConfigurationJsonSerializer.FIELD_COURSE_AREA_NAMES);
JSONArray courseAreaNames = Helpers.getNestedArraySafe(object,
DeviceConfigurationJsonSerializer.FIELD_COURSE_AREA_NAMES);
List<String> allowedCourseAreaNames = new ArrayList<String>();
for (Object name : courseAreaNames) {
allowedCourseAreaNames.add(name.toString());
@@ -55,14 +56,14 @@ public class DeviceConfigurationJsonDeserializer implements JsonDeserializer<Dev
}
if (object.containsKey(DeviceConfigurationJsonSerializer.FIELD_DEFAULT_RACING_PROCEDURE_TYPE)) {
RacingProcedureType type = RacingProcedureType.valueOf(
object.get(DeviceConfigurationJsonSerializer.FIELD_DEFAULT_RACING_PROCEDURE_TYPE).toString());
RacingProcedureType type = RacingProcedureType.valueOf(object.get(
DeviceConfigurationJsonSerializer.FIELD_DEFAULT_RACING_PROCEDURE_TYPE).toString());
configuration.setDefaultRacingProcedureType(type);
}
if (object.containsKey(DeviceConfigurationJsonSerializer.FIELD_DEFAULT_COURSE_DESIGNER_MODE)) {
CourseDesignerMode mode = CourseDesignerMode.valueOf(
object.get(DeviceConfigurationJsonSerializer.FIELD_DEFAULT_COURSE_DESIGNER_MODE).toString());
CourseDesignerMode mode = CourseDesignerMode.valueOf(object.get(
DeviceConfigurationJsonSerializer.FIELD_DEFAULT_COURSE_DESIGNER_MODE).toString());
configuration.setDefaultCourseDesignerMode(mode);
}
@@ -0,0 +1,36 @@
package com.sap.sailing.server.gateway.deserialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration;
import com.sap.sailing.domain.base.configuration.impl.ESSConfigurationImpl;
import com.sap.sailing.domain.base.configuration.procedures.ESSConfiguration;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
public class ESSConfigurationJsonDeserializer extends RacingProcedureConfigurationJsonDeserializer implements
JsonDeserializer<RacingProcedureConfiguration> {
public static ESSConfigurationJsonDeserializer create() {
return new ESSConfigurationJsonDeserializer();
}
public ESSConfigurationJsonDeserializer() {
super();
}
@Override
public ESSConfiguration deserialize(JSONObject object) throws JsonDeserializationException {
return (ESSConfiguration) super.deserialize(object);
}
protected ESSConfiguration createResult(JSONObject object, Flags classFlag, Boolean inidividualRecall)
throws JsonDeserializationException {
ESSConfigurationImpl result = new ESSConfigurationImpl();
result.setClassFlag(classFlag);
result.setHasInidividualRecall(inidividualRecall);
return result;
}
}
@@ -0,0 +1,36 @@
package com.sap.sailing.server.gateway.deserialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration;
import com.sap.sailing.domain.base.configuration.impl.GateStartConfigurationImpl;
import com.sap.sailing.domain.base.configuration.procedures.GateStartConfiguration;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
public class GateStartConfigurationJsonDeserializer extends RacingProcedureConfigurationJsonDeserializer implements JsonDeserializer<RacingProcedureConfiguration> {
public static GateStartConfigurationJsonDeserializer create() {
return new GateStartConfigurationJsonDeserializer();
}
public GateStartConfigurationJsonDeserializer() {
super();
}
@Override
public GateStartConfiguration deserialize(JSONObject object) throws JsonDeserializationException {
return (GateStartConfiguration) super.deserialize(object);
}
protected GateStartConfiguration createResult(JSONObject object, Flags classFlag, Boolean inidividualRecall) throws JsonDeserializationException {
GateStartConfigurationImpl result = new GateStartConfigurationImpl();
result.setClassFlag(classFlag);
result.setHasInidividualRecall(inidividualRecall);
return result;
}
}
@@ -0,0 +1,53 @@
package com.sap.sailing.server.gateway.deserialization.impl;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import java.util.ArrayList;
import java.util.List;
import com.sap.sailing.domain.base.configuration.impl.RRS26ConfigurationImpl;
import com.sap.sailing.domain.base.configuration.procedures.RRS26Configuration;
import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.serialization.impl.RRS26ConfigurationJsonSerializer;
public class RRS26ConfigurationJsonDeserializer extends RacingProcedureConfigurationJsonDeserializer implements
JsonDeserializer<RacingProcedureConfiguration> {
public static RRS26ConfigurationJsonDeserializer create() {
return new RRS26ConfigurationJsonDeserializer();
}
public RRS26ConfigurationJsonDeserializer() {
super();
}
@Override
public RRS26Configuration deserialize(JSONObject object) throws JsonDeserializationException {
return (RRS26Configuration) super.deserialize(object);
}
protected RRS26Configuration createResult(JSONObject object, Flags classFlag, Boolean inidividualRecall)
throws JsonDeserializationException {
List<Flags> startModeFlags = null;
if (object.containsKey(RRS26ConfigurationJsonSerializer.FIELD_START_MODE_FLAGS)) {
startModeFlags = new ArrayList<Flags>();
JSONArray objects = Helpers.getNestedArraySafe(object,
RRS26ConfigurationJsonSerializer.FIELD_START_MODE_FLAGS);
for (Object value : objects) {
startModeFlags.add(Flags.valueOf(value.toString()));
}
}
RRS26ConfigurationImpl result = new RRS26ConfigurationImpl();
result.setClassFlag(classFlag);
result.setHasInidividualRecall(inidividualRecall);
result.setStartModeFlags(startModeFlags);
return result;
}
}
@@ -0,0 +1,47 @@
package com.sap.sailing.server.gateway.deserialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration;
import com.sap.sailing.domain.base.configuration.impl.RacingProcedureConfigurationImpl;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.serialization.impl.RacingProcedureConfigurationJsonSerializer;
public class RacingProcedureConfigurationJsonDeserializer implements JsonDeserializer<RacingProcedureConfiguration> {
public static RacingProcedureConfigurationJsonDeserializer create() {
return new RacingProcedureConfigurationJsonDeserializer();
}
public RacingProcedureConfigurationJsonDeserializer() {
}
@Override
public RacingProcedureConfiguration deserialize(JSONObject object) throws JsonDeserializationException {
Boolean inidividualRecall = null;
if (object.containsKey(RacingProcedureConfigurationJsonSerializer.FIELD_INIDIVIDUAL_RECALL)) {
inidividualRecall = ((Boolean) object
.get(RacingProcedureConfigurationJsonSerializer.FIELD_INIDIVIDUAL_RECALL));
}
Flags classFlag = null;
if (object.containsKey(RacingProcedureConfigurationJsonSerializer.FIELD_CLASS_FLAG)) {
classFlag = Flags.valueOf(object.get(RacingProcedureConfigurationJsonSerializer.FIELD_CLASS_FLAG)
.toString());
}
return createResult(object, inidividualRecall, classFlag);
}
protected RacingProcedureConfiguration createResult(JSONObject object, Boolean inidividualRecall, Flags classFlag)
throws JsonDeserializationException{
RacingProcedureConfigurationImpl result = new RacingProcedureConfigurationImpl();
result.setHasInidividualRecall(inidividualRecall);
result.setClassFlag(classFlag);
return result;
}
}
@@ -1,42 +1,55 @@
package com.sap.sailing.server.gateway.deserialization.impl;
import java.util.ArrayList;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.configuration.RacingProceduresConfiguration;
import com.sap.sailing.domain.base.configuration.impl.RacingProceduresConfigurationImpl;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.domain.base.configuration.procedures.ESSConfiguration;
import com.sap.sailing.domain.base.configuration.procedures.GateStartConfiguration;
import com.sap.sailing.domain.base.configuration.procedures.RRS26Configuration;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.serialization.impl.RacingProceduresConfigurationJsonSerializer;
public class RacingProceduresConfigurationJsonDeserializer implements JsonDeserializer<RacingProceduresConfiguration> {
private RRS26ConfigurationJsonDeserializer rrs26Deserializer;
private GateStartConfigurationJsonDeserializer gateStartDeserializer;
private ESSConfigurationJsonDeserializer essDeserializer;
public static RacingProceduresConfigurationJsonDeserializer create() {
return new RacingProceduresConfigurationJsonDeserializer(RRS26ConfigurationJsonDeserializer.create(),
GateStartConfigurationJsonDeserializer.create(), ESSConfigurationJsonDeserializer.create());
}
public RacingProceduresConfigurationJsonDeserializer(RRS26ConfigurationJsonDeserializer rrs26,
GateStartConfigurationJsonDeserializer gateStart, ESSConfigurationJsonDeserializer ess) {
this.rrs26Deserializer = rrs26;
this.gateStartDeserializer = gateStart;
this.essDeserializer = ess;
}
@Override
public RacingProceduresConfiguration deserialize(JSONObject object) throws JsonDeserializationException {
RacingProceduresConfigurationImpl configuration = createConfiguration();
if (object.containsKey(RacingProceduresConfigurationJsonSerializer.FIELD_HAS_XRAY)) {
Boolean hasIndividualRecall = (Boolean) object.get(RacingProceduresConfigurationJsonSerializer.FIELD_HAS_XRAY);
configuration.setHasInidividualRecall(hasIndividualRecall);
if (object.containsKey(RacingProceduresConfigurationJsonSerializer.FIELD_RRS26)) {
RRS26Configuration rrs26Configuration = rrs26Deserializer.deserialize(
Helpers.getNestedObjectSafe(object, RacingProceduresConfigurationJsonSerializer.FIELD_RRS26));
configuration.setRRS26Configuration(rrs26Configuration);
}
if (object.containsKey(RacingProceduresConfigurationJsonSerializer.FIELD_CLASS_FLAG)) {
Flags classFlag = Flags.valueOf(object.get(RacingProceduresConfigurationJsonSerializer.FIELD_CLASS_FLAG).toString());
configuration.setClassFlag(classFlag);
if (object.containsKey(RacingProceduresConfigurationJsonSerializer.FIELD_GATE_START)) {
GateStartConfiguration gateStartConfiguration =
gateStartDeserializer.deserialize(
Helpers.getNestedObjectSafe(object, RacingProceduresConfigurationJsonSerializer.FIELD_GATE_START));
configuration.setGateStartConfiguration(gateStartConfiguration);
}
if (object.containsKey(RacingProceduresConfigurationJsonSerializer.FIELD_START_MODE_FLAGS)) {
List<Flags> result = new ArrayList<Flags>();
JSONArray startModeFlags = Helpers.getNestedArraySafe(object,
RacingProceduresConfigurationJsonSerializer.FIELD_START_MODE_FLAGS);
for (Object startModeFlag : startModeFlags) {
result.add(Flags.valueOf(startModeFlag.toString()));
}
configuration.setStartModeFlags(result);
if (object.containsKey(RacingProceduresConfigurationJsonSerializer.FIELD_ESS)) {
ESSConfiguration essConfiguration = essDeserializer.deserialize(
Helpers.getNestedObjectSafe(object, RacingProceduresConfigurationJsonSerializer.FIELD_ESS));
configuration.setESSConfiguration(essConfiguration);
}
return configuration;
@@ -7,6 +7,8 @@ import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.base.configuration.RacingProceduresConfiguration;
import com.sap.sailing.domain.base.racegroup.RaceGroup;
import com.sap.sailing.domain.base.racegroup.SeriesWithRows;
import com.sap.sailing.domain.base.racegroup.impl.RaceGroupImpl;
@@ -14,19 +16,35 @@ import com.sap.sailing.domain.common.CourseDesignerMode;
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.deserialization.impl.BoatClassJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.ColorDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.FleetDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogDeserializer;
import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogEventDeserializer;
import com.sap.sailing.server.gateway.serialization.racegroup.impl.RaceGroupJsonSerializer;
import com.sap.sailing.server.gateway.serialization.racegroup.impl.SeriesWithRowsOfRaceGroupSerializer;
public class RaceGroupDeserializer implements JsonDeserializer<RaceGroup> {
private JsonDeserializer<BoatClass> boatClassDeserializer;
private JsonDeserializer<SeriesWithRows> seriesDeserializer;
private final JsonDeserializer<BoatClass> boatClassDeserializer;
private final JsonDeserializer<SeriesWithRows> seriesDeserializer;
private final JsonDeserializer<RacingProceduresConfiguration> proceduresDeserializer;
public static RaceGroupDeserializer create(SharedDomainFactory domainFactory,
JsonDeserializer<RacingProceduresConfiguration> proceduresDeserializer) {
return new RaceGroupDeserializer(new BoatClassJsonDeserializer(domainFactory), new SeriesWithRowsDeserializer(
new RaceRowDeserializer(new FleetDeserializer(new ColorDeserializer()), new RaceCellDeserializer(
new RaceLogDeserializer(RaceLogEventDeserializer.create(domainFactory))))),
proceduresDeserializer);
}
public RaceGroupDeserializer(JsonDeserializer<BoatClass> boatClassDeserializer,
JsonDeserializer<SeriesWithRows> seriesDeserializer) {
JsonDeserializer<SeriesWithRows> seriesDeserializer,
JsonDeserializer<RacingProceduresConfiguration> proceduresDeserializer) {
this.boatClassDeserializer = boatClassDeserializer;
this.seriesDeserializer = seriesDeserializer;
this.proceduresDeserializer = proceduresDeserializer;
}
public RaceGroup deserialize(JSONObject object) throws JsonDeserializationException {
@@ -35,6 +53,7 @@ public class RaceGroupDeserializer implements JsonDeserializer<RaceGroup> {
CourseArea courseArea = null;
RacingProcedureType procedure = RacingProcedureType.UNKNOWN;
CourseDesignerMode designer = CourseDesignerMode.UNKNOWN;
RacingProceduresConfiguration proceduresConfiguration = null;
if (object.containsKey(RaceGroupJsonSerializer.FIELD_COURSE_AREA)) {
// TODO: deserialize CourseArea ...
@@ -46,21 +65,27 @@ public class RaceGroupDeserializer implements JsonDeserializer<RaceGroup> {
RaceGroupJsonSerializer.FIELD_BOAT_CLASS));
}
if (object.containsKey(RaceGroupJsonSerializer.FIELD_DEFAULT_RACING_PROCEDURE)) {
procedure = RacingProcedureType.valueOf(
object.get(RaceGroupJsonSerializer.FIELD_DEFAULT_RACING_PROCEDURE).toString());
}
if (object.containsKey(RaceGroupJsonSerializer.FIELD_DEFAULT_COURSE_DESIGNER)) {
designer = CourseDesignerMode.valueOf(
object.get(RaceGroupJsonSerializer.FIELD_DEFAULT_COURSE_DESIGNER).toString());
}
Collection<SeriesWithRows> series = new ArrayList<SeriesWithRows>();
for (Object seriesObject : Helpers.getNestedArraySafe(object, SeriesWithRowsOfRaceGroupSerializer.FIELD_SERIES)) {
JSONObject seriesJson = Helpers.toJSONObjectSafe(seriesObject);
series.add(seriesDeserializer.deserialize(seriesJson));
}
return new RaceGroupImpl(name, boatClass, courseArea, series, procedure, designer);
if (object.containsKey(RaceGroupJsonSerializer.FIELD_DEFAULT_RACING_PROCEDURE)) {
procedure = RacingProcedureType.valueOf(object.get(RaceGroupJsonSerializer.FIELD_DEFAULT_RACING_PROCEDURE)
.toString());
}
if (object.containsKey(RaceGroupJsonSerializer.FIELD_DEFAULT_COURSE_DESIGNER)) {
designer = CourseDesignerMode.valueOf(object.get(RaceGroupJsonSerializer.FIELD_DEFAULT_COURSE_DESIGNER)
.toString());
}
if (object.containsKey(RaceGroupJsonSerializer.FIELD_RACING_PROCEDURES_CONFIGURATION)) {
JSONObject value = Helpers.getNestedObjectSafe(object, RaceGroupJsonSerializer.FIELD_RACING_PROCEDURES_CONFIGURATION);
proceduresConfiguration = proceduresDeserializer.deserialize(value);
}
return new RaceGroupImpl(name, boatClass, courseArea, series, procedure, designer, proceduresConfiguration);
}
}
@@ -17,7 +17,7 @@ public class DeviceConfigurationJsonSerializer implements JsonSerializer<DeviceC
public static final String FIELD_PROCEDURES_CONFIGURATION = "procedures";
public static DeviceConfigurationJsonSerializer create() {
return new DeviceConfigurationJsonSerializer(new RacingProceduresConfigurationJsonSerializer());
return new DeviceConfigurationJsonSerializer(RacingProceduresConfigurationJsonSerializer.create());
}
private final JsonSerializer<RacingProceduresConfiguration> proceduresSerializer;
@@ -0,0 +1,29 @@
package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration;
import com.sap.sailing.domain.base.configuration.procedures.ESSConfiguration;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class ESSConfigurationJsonSerializer extends RacingProcedureConfigurationJsonSerializer implements
JsonSerializer<RacingProcedureConfiguration> {
public static ESSConfigurationJsonSerializer create() {
return new ESSConfigurationJsonSerializer();
}
public ESSConfigurationJsonSerializer() {
super();
}
@Override
public JSONObject serialize(RacingProcedureConfiguration baseObject) {
JSONObject result = super.serialize(baseObject);
@SuppressWarnings("unused")
ESSConfiguration object = (ESSConfiguration) baseObject;
return result;
}
}
@@ -0,0 +1,29 @@
package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration;
import com.sap.sailing.domain.base.configuration.procedures.GateStartConfiguration;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class GateStartConfigurationJsonSerializer extends RacingProcedureConfigurationJsonSerializer implements
JsonSerializer<RacingProcedureConfiguration> {
public static GateStartConfigurationJsonSerializer create() {
return new GateStartConfigurationJsonSerializer();
}
public GateStartConfigurationJsonSerializer() {
super();
}
@Override
public JSONObject serialize(RacingProcedureConfiguration baseObject) {
JSONObject result = super.serialize(baseObject);
@SuppressWarnings("unused")
GateStartConfiguration object = (GateStartConfiguration) baseObject;
return result;
}
}
@@ -0,0 +1,40 @@
package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration;
import com.sap.sailing.domain.base.configuration.procedures.RRS26Configuration;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class RRS26ConfigurationJsonSerializer extends RacingProcedureConfigurationJsonSerializer implements
JsonSerializer<RacingProcedureConfiguration> {
public static RRS26ConfigurationJsonSerializer create() {
return new RRS26ConfigurationJsonSerializer();
}
public static final String FIELD_START_MODE_FLAGS = "startModeFlags";
public RRS26ConfigurationJsonSerializer() {
super();
}
@Override
public JSONObject serialize(RacingProcedureConfiguration baseObject) {
JSONObject result = super.serialize(baseObject);
RRS26Configuration object = (RRS26Configuration) baseObject;
if (object.getStartModeFlags() != null) {
JSONArray startModeFlags = new JSONArray();
for (Flags item : object.getStartModeFlags()) {
startModeFlags.add(item);
}
result.put(FIELD_START_MODE_FLAGS, startModeFlags);
}
return result;
}
}
@@ -0,0 +1,35 @@
package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class RacingProcedureConfigurationJsonSerializer implements JsonSerializer<RacingProcedureConfiguration> {
public static RacingProcedureConfigurationJsonSerializer create() {
return new RacingProcedureConfigurationJsonSerializer();
}
public static final String FIELD_INIDIVIDUAL_RECALL = "inidividualRecall";
public static final String FIELD_CLASS_FLAG = "classFlag";
public RacingProcedureConfigurationJsonSerializer() {
}
@Override
public JSONObject serialize(RacingProcedureConfiguration object) {
JSONObject result = new JSONObject();
if (object.hasInidividualRecall() != null) {
result.put(FIELD_INIDIVIDUAL_RECALL, object.hasInidividualRecall());
}
if (object.getClassFlag() != null) {
result.put(FIELD_CLASS_FLAG, object.getClassFlag().name());
}
return result;
}
}
@@ -1,34 +1,45 @@
package com.sap.sailing.server.gateway.serialization.impl;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.configuration.RacingProcedureConfiguration;
import com.sap.sailing.domain.base.configuration.RacingProceduresConfiguration;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class RacingProceduresConfigurationJsonSerializer implements JsonSerializer<RacingProceduresConfiguration> {
public static final String FIELD_CLASS_FLAG = "classFlag";
public static final String FIELD_START_MODE_FLAGS = "startModeFlags";
public static final String FIELD_HAS_XRAY = "hasIndividualRecall";
private JsonSerializer<RacingProcedureConfiguration> rrs26Serializer;
private JsonSerializer<RacingProcedureConfiguration> gateStartSerializer;
private JsonSerializer<RacingProcedureConfiguration> essSerializer;
public static RacingProceduresConfigurationJsonSerializer create() {
return new RacingProceduresConfigurationJsonSerializer(RRS26ConfigurationJsonSerializer.create(),
GateStartConfigurationJsonSerializer.create(), ESSConfigurationJsonSerializer.create());
}
public RacingProceduresConfigurationJsonSerializer(JsonSerializer<RacingProcedureConfiguration> rrs26,
JsonSerializer<RacingProcedureConfiguration> gateStart, JsonSerializer<RacingProcedureConfiguration> ess) {
this.rrs26Serializer = rrs26;
this.gateStartSerializer = gateStart;
this.essSerializer = ess;
}
public static final String FIELD_RRS26 = "rrs26";
public static final String FIELD_GATE_START = "gateStart";
public static final String FIELD_ESS = "ess";
@Override
public JSONObject serialize(RacingProceduresConfiguration object) {
JSONObject result = new JSONObject();
if (object.hasInidividualRecall() != null) {
result.put(FIELD_HAS_XRAY, object.hasInidividualRecall());
if (object.getRRS26Configuration() != null) {
result.put(FIELD_RRS26, rrs26Serializer.serialize(object.getRRS26Configuration()));
}
if (object.getClassFlag() != null) {
result.put(FIELD_CLASS_FLAG, object.getClassFlag().name());
if (object.getGateStartConfiguration() != null) {
result.put(FIELD_GATE_START, gateStartSerializer.serialize(object.getGateStartConfiguration()));
}
if (object.getStartModeFlags() != null) {
JSONArray startModeFlags = new JSONArray();
for (Flags startModeFlag : object.getStartModeFlags()) {
startModeFlags.add(startModeFlag);
}
result.put(FIELD_START_MODE_FLAGS, startModeFlags);
if (object.getESSConfiguration() != null) {
result.put(FIELD_ESS, essSerializer.serialize(object.getESSConfiguration()));
}
return result;
}
@@ -15,6 +15,7 @@ public class RaceGroupJsonSerializer extends ExtendableJsonSerializer<RaceGroup>
public static final String FIELD_BOAT_CLASS = "boatClass";
public static final String FIELD_DEFAULT_RACING_PROCEDURE = "defaultProcedure";
public static final String FIELD_DEFAULT_COURSE_DESIGNER = "defaultCourseDesigner";
public static final String FIELD_RACING_PROCEDURES_CONFIGURATION = "proceduresConfiguration";
private JsonSerializer<BoatClass> boatClassSerializer;
private JsonSerializer<CourseArea> courseAreaSerializer;
@@ -50,6 +51,10 @@ public class RaceGroupJsonSerializer extends ExtendableJsonSerializer<RaceGroup>
result.put(FIELD_DEFAULT_COURSE_DESIGNER, object.getDefaultCourseDesignerMode().name());
}
if (object.getRacingProceduresConfiguration() != null) {
result.put(FIELD_RACING_PROCEDURES_CONFIGURATION, object.getRacingProceduresConfiguration());
}
return result;
}
@@ -29,8 +29,8 @@ public class RaceLogFlagEventSerializer extends BaseRaceLogEventSerializer {
RaceLogFlagEvent flagEvent = (RaceLogFlagEvent) object;
JSONObject result = super.serialize(flagEvent);
result.put(FIELD_UPPER_FLAG, flagEvent.getUpperFlag().toString());
result.put(FIELD_LOWER_FLAG, flagEvent.getLowerFlag().toString());
result.put(FIELD_UPPER_FLAG, flagEvent.getUpperFlag().name());
result.put(FIELD_LOWER_FLAG, flagEvent.getLowerFlag().name());
result.put(FIELD_DISPLAYED, flagEvent.isDisplayed());
return result;
@@ -14,6 +14,7 @@ import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceColumnInSeries;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.configuration.RacingProceduresConfiguration;
import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.base.racegroup.RaceCell;
import com.sap.sailing.domain.base.racegroup.RaceGroup;
@@ -46,18 +47,20 @@ public class RaceGroupFactory {
BoatClass boatClass = null;
RacingProcedureType defaultProcedureType = RacingProcedureType.UNKNOWN;
CourseDesignerMode defaultCourseDesignerMode = CourseDesignerMode.UNKNOWN;
RacingProceduresConfiguration procedureConfiguration = null;
if (leaderboard instanceof RegattaLeaderboard) {
Regatta regatta = ((RegattaLeaderboard) leaderboard).getRegatta();
boatClass = regatta.getBoatClass();
defaultProcedureType = regatta.getDefaultRacingProcedureType();
defaultCourseDesignerMode = regatta.getDefaultCourseDesignerMode();
//procedureConfiguration = regatta.getRacingProceduresConfiguration();
}
Iterable<SeriesWithRows> series = getSeries(leaderboard);
return new RaceGroupImpl(name, boatClass, courseArea, series,
defaultProcedureType, defaultCourseDesignerMode);
defaultProcedureType, defaultCourseDesignerMode, procedureConfiguration);
}
public Iterable<SeriesWithRows> getSeries(Leaderboard leaderboard) {
@@ -32,5 +32,5 @@
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.igtimiadapter*1.0.0.qualifier@default:default,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@5:true,com.sap.sailing.domain.swisstimingreplayadapter@5:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@5:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@4:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.nmeaconnector@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@4:true,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.replication@4:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@4:true,com.sap.sailing.www@4:true,com.sap.sailing.xcelsiusadapter@4:true,com.sap.sailing.xrr.resultimport@default:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,net.sf.marineapi@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.igtimiadapter.persistence@default:default,com.sap.sailing.domain.igtimiadapter@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@5:true,com.sap.sailing.domain.swisstimingreplayadapter@5:true,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@5:true,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@4:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.nmeaconnector@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@4:true,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.replication@4:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@4:true,com.sap.sailing.www@4:true,com.sap.sailing.xcelsiusadapter@4:true,com.sap.sailing.xrr.resultimport@default:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,net.sf.marineapi@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
</launchConfiguration>
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sap.sailing.racecommittee.app"
android:versionCode="2"
android:versionName="2.1 - Kulig" >
android:versionCode="3"
android:versionName="3.0a - Lasogga" >
<uses-sdk
android:maxSdkVersion="17"
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<include
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
layout="@android:layout/simple_list_item_1" />
<ImageButton
android:id="@+id/array_remove_adapter_remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:layout_gravity="center"
android:src="@drawable/ic_menu_delete_dark"
android:contentDescription="@string/remove" />
</LinearLayout>
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="12dp" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<AutoCompleteTextView
android:id="@+id/edit_set_preference_input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:completionThreshold="1"
android:hint="@string/enter_new_item"
android:inputType="textNoSuggestions|textVisiblePassword" />
<Button
android:id="@+id/edit_set_preference_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:text="@string/add" />
</LinearLayout>
<ListView
android:id="@+id/edit_set_preference_list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/edit_set_preference_list_empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_margin="6dp"
android:gravity="center"
android:text="@string/there_are_no_items_yet_" />
</LinearLayout>
@@ -1,23 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="preference_language_key">languagePref</string>
<string name="preference_server_url_key">webserviceUrlPref</string>
<string name="preference_server_url_default">http://192.168.56.1:8880</string>
<string name="preference_course_areas_key">courseAreasPref</string>
<string name="preference_course_areas_default">Alpha,Bravo</string>
<string-array name="preference_course_areas_default">
<item>Alpha</item>
</string-array>
<string-array name="preference_course_areas_example">
<item>Alpha</item>
<item>Bravo</item>
<item>Charly</item>
<item>Stadion</item>
<item>Offshore</item>
</string-array>
<string name="preference_mail_key">mailRecipientPreference</string>
<string name="preference_mail_default">lukas.niemeier@sap.com</string>
<string name="preference_racing_procedure_is_overridden_key">overrideDefaultRacingProcedureType</string>
<bool name="preference_racing_procedure_is_overridden_default">false</bool>
<string name="preference_racing_procedure_override_key">defaultRacingProcedureType</string>
<string name="preference_racing_procedure_override_default">RRS26</string>
<string name="preference_course_designer_is_overridden_key">overrideDefaultCourseDesignerType</string>
<bool name="preference_course_designer_is_overridden_default">false</bool>
<string name="preference_course_designer_override_key">defaultCourseDesignerType</string>
<string name="preference_course_designer_override_default">BY_NAME</string>
<string name="preference_course_designer_by_name_course_names_key">courseDesignerByNameCourseNames</string>
<string name="preference_course_designer_by_name_course_names_default">O2,I2,O3</string>
<string-array name="preference_course_designer_by_name_course_names_default">
<item>O2</item>
<item>I2</item>
<item>O3</item>
</string-array>
<string-array name="preference_course_designer_by_name_course_names_example">
<item>O1</item>
<item>O2</item>
<item>O3</item>
<item>I1</item>
<item>I2</item>
<item>I3</item>
</string-array>
<string name="preference_racing_procedure_rrs26_classflag_key">rrs26ClassFlag</string>
<string name="preference_racing_procedure_classflag_default">CLASS</string>
<string name="preference_racing_procedure_rrs26_hasxray_key">rrs26IndividualRecall</string>
<bool name="preference_racing_procedure_rrs26_hasxray_default">true</bool>
<string name="preference_racing_procedure_rrs26_startmode_flags_key">rrs26StartmodeFlags</string>
<string-array name="preference_racing_procedure_rrs26_startmode_flags_default">
<item>PAPA</item>
<item>INDIA</item>
<item>BLACK</item>
<item>ZULU</item>
</string-array>
<string name="preference_racing_procedure_gatestart_classflag_key">gateStartClassFlag</string>
<string name="preference_racing_procedure_gatestart_hasxray_key">gateStartIndividualRecall</string>
<bool name="preference_racing_procedure_gatestart_hasxray_default">false</bool>
<string name="preference_racing_procedure_ess_classflag_key">gateStartClassFlag</string>
<string name="preference_racing_procedure_ess_hasxray_key">gateStartIndividualRecall</string>
<bool name="preference_racing_procedure_ess_hasxray_default">true</bool>
</resources>
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="empty_array"/>
<string name="hello">Hello World, RaceCommitteeActivity!</string>
<string name="running_on_course">(on course %s)</string>
@@ -276,4 +277,14 @@
<string name="override_default_course_designer_type_description">Use configured Course Designer instead of race\'s.</string>
<string name="override_default_course_designer_type_select_header">Course Designer type</string>
<string name="settings_course_designer_by_name_course_names_header">Course Names</string>
<string name="enter_new_item">Enter new item</string>
<string name="add">Add</string>
<string name="there_are_no_items_yet_">There are no items yet.</string>
<string name="preference_racing_procedure_rrs26_startmode_flags_header">Startmode Flags</string>
<string name="preference_racing_procedure_classflag_header">Class Flag</string>
<string name="preference_racing_procedure_hasxray_header">Activate Individual Recall</string>
</resources>
@@ -19,10 +19,10 @@
<PreferenceCategory android:title="By-Name Course Designer" >
<EditTextPreference
<com.sap.sailing.racecommittee.app.ui.views.EditSetPreference
android:key="@string/preference_course_designer_by_name_course_names_key"
android:defaultValue="@string/preference_course_designer_by_name_course_names_default"
android:title="Course Names"
android:defaultValue="@array/preference_course_designer_by_name_course_names_default"
android:title="@string/settings_course_designer_by_name_course_names_header"
android:summary="@string/empty" />
</PreferenceCategory>
@@ -12,15 +12,9 @@
android:title="@string/settings_advanced_service_header"
android:summary="@string/empty" />
<EditTextPreference
<com.sap.sailing.racecommittee.app.ui.views.EditSetPreference
android:key="@string/preference_course_areas_key"
android:defaultValue="@string/preference_course_areas_default"
android:title="@string/settings_general_manageareas_header"
android:summary="@string/empty" />
<com.sap.sailing.racecommittee.app.ui.fragments.preference.EditListPreference
android:key="what_a_key"
android:defaultValue="a,b,c"
android:defaultValue="@array/preference_course_areas_default"
android:title="@string/settings_general_manageareas_header"
android:summary="@string/empty" />
@@ -4,47 +4,71 @@
<PreferenceCategory android:title="@string/settings_category_general" >
<CheckBoxPreference
android:defaultValue="@bool/preference_racing_procedure_is_overridden_default"
android:key="@string/preference_racing_procedure_is_overridden_key"
android:defaultValue="@bool/preference_racing_procedure_is_overridden_default"
android:summary="@string/override_default_start_procedure_type_description"
android:title="@string/override_default_start_procedure_type_header" />
<ListPreference
android:defaultValue="@string/preference_racing_procedure_override_default"
android:key="@string/preference_racing_procedure_override_key"
android:defaultValue="@string/preference_racing_procedure_override_default"
android:summary="@string/override_default_start_procedure_type_select_description"
android:title="@string/override_default_start_procedure_type_select_header" />
</PreferenceCategory>
<!-- <PreferenceCategory android:title="RRS26" >
<PreferenceCategory android:title="RRS26" >
<ListPreference
android:key="@string/preference_racing_procedure_rrs26_classflag_key"
android:defaultValue="@string/preference_racing_procedure_classflag_default"
android:title="@string/preference_racing_procedure_classflag_header"
android:summary="@string/empty" />
<CheckBoxPreference
android:defaultValue="false"
android:key="noOperationPreference"
android:summary="@string/empty"
android:title="@string/empty" />
android:key="@string/preference_racing_procedure_rrs26_hasxray_key"
android:defaultValue="@bool/preference_racing_procedure_rrs26_hasxray_default"
android:title="@string/preference_racing_procedure_hasxray_header"
android:summary="@string/empty" />
<com.sap.sailing.racecommittee.app.ui.views.FixedMultiSelectListPreference
android:key="@string/preference_racing_procedure_rrs26_startmode_flags_key"
android:defaultValue="@array/preference_racing_procedure_rrs26_startmode_flags_default"
android:title="@string/preference_racing_procedure_rrs26_startmode_flags_header"
android:summary="@string/empty" />
</PreferenceCategory>
<PreferenceCategory android:title="Gate Start" >
<ListPreference
android:key="@string/preference_racing_procedure_gatestart_classflag_key"
android:defaultValue="@string/preference_racing_procedure_classflag_default"
android:title="@string/preference_racing_procedure_classflag_header"
android:summary="@string/empty" />
<CheckBoxPreference
android:defaultValue="false"
android:key="noOperationPreference"
android:summary="@string/empty"
android:title="@string/empty" />
android:key="@string/preference_racing_procedure_gatestart_hasxray_key"
android:defaultValue="@bool/preference_racing_procedure_gatestart_hasxray_default"
android:title="@string/preference_racing_procedure_hasxray_header"
android:summary="@string/empty" />
</PreferenceCategory>
<PreferenceCategory android:title="ESS Start" >
<CheckBoxPreference
android:defaultValue="false"
android:key="noOperationPreference"
android:summary="@string/empty"
android:title="@string/empty" />
<ListPreference
android:key="@string/preference_racing_procedure_ess_classflag_key"
android:defaultValue="@string/preference_racing_procedure_classflag_default"
android:title="@string/preference_racing_procedure_classflag_header"
android:summary="@string/empty" />
</PreferenceCategory> -->
<CheckBoxPreference
android:key="@string/preference_racing_procedure_ess_hasxray_key"
android:defaultValue="@bool/preference_racing_procedure_ess_hasxray_default"
android:title="@string/preference_racing_procedure_hasxray_header"
android:summary="@string/empty" />
</PreferenceCategory>
</PreferenceScreen>
@@ -1,7 +1,9 @@
package com.sap.sailing.racecommittee.app;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import android.content.Context;
import android.content.SharedPreferences;
@@ -9,6 +11,7 @@ import android.preference.PreferenceManager;
import android.provider.Settings.Secure;
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.sailing.domain.racelog.RaceLogEventAuthor;
import com.sap.sailing.domain.racelog.impl.RaceLogEventAuthorImpl;
@@ -18,27 +21,28 @@ 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;
/**
* Wrapper for {@link SharedPreferences} for all hidden and non-hidden preferences and state variables.
*/
public class AppPreferences {
//private static String TAG = AppPreferences.class.getSimpleName();
public static AppPreferences on(Context context) {
return new AppPreferences(context);
}
private final static String PREFERENCE_SENDING_ACTIVE = "sendingActivePref";
private final static String HIDDEN_PREFERENCE_SENDING_ACTIVE = "sendingActivePref";
private final static String PREFERENCE_AUTHOR_NAME = "authorName";
private final static String PREFERENCE_AUTHOR_PRIORITY = "authorPriority";
private final static String HIDDEN_PREFERENCE_AUTHOR_NAME = "authorName";
private final static String HIDDEN_PREFERENCE_AUTHOR_PRIORITY = "authorPriority";
private final static String PREFERENCE_WIND_BEARING = "windBearingPref";
private final static String PREFERENCE_WIND_SPEED = "windSpeedPref";
private final static String HIDDEN_PREFERENCE_WIND_BEARING = "windBearingPref";
private final static String HIDDEN_PREFERENCE_WIND_SPEED = "windSpeedPref";
private final static String PREFERENCE_BOAT_CLASS = "boatClassPref";
private final static String PREFERENCE_COURSE_LAYOUT = "courseLayoutPref";
private final static String PREFERENCE_NUMBER_OF_ROUNDS = "numberOfRoundsPref";
private final static String HIDDEN_PREFERENCE_BOAT_CLASS = "boatClassPref";
private final static String HIDDEN_PREFERENCE_COURSE_LAYOUT = "courseLayoutPref";
private final static String HIDDEN_PREFERENCE_NUMBER_OF_ROUNDS = "numberOfRoundsPref";
private final static String PREFERENCE_PROCEDURE_CONFIG_OVERWRITE = "procedureConfigOverwriteAllowed";
private final static String HIDDEN_PREFERENCE_PROCEDURE_CONFIG_OVERWRITE = "procedureConfigOverwriteAllowed";
private final SharedPreferences preferences;
private final Context context;
@@ -48,27 +52,35 @@ public class AppPreferences {
this.preferences = PreferenceManager.getDefaultSharedPreferences(context);
}
private String key(int keyId) {
return context.getString(keyId);
}
public String getAndroidIdentifier() {
return Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
}
public boolean isSendingActive() {
return preferences.getBoolean(PREFERENCE_SENDING_ACTIVE, false);
return preferences.getBoolean(HIDDEN_PREFERENCE_SENDING_ACTIVE, false);
}
public void setSendingActive(boolean activate) {
preferences.edit().putBoolean(PREFERENCE_SENDING_ACTIVE, activate).commit();
preferences.edit().putBoolean(HIDDEN_PREFERENCE_SENDING_ACTIVE, activate).commit();
}
public void setAuthor(RaceLogEventAuthor author) {
preferences.edit().putString(PREFERENCE_AUTHOR_NAME, author.getName()).commit();
preferences.edit().putInt(PREFERENCE_AUTHOR_PRIORITY, author.getPriority()).commit();
preferences.edit().putString(HIDDEN_PREFERENCE_AUTHOR_NAME, author.getName()).commit();
preferences.edit().putInt(HIDDEN_PREFERENCE_AUTHOR_PRIORITY, author.getPriority()).commit();
}
public RaceLogEventAuthor getAuthor() {
String authorName = preferences.getString(PREFERENCE_AUTHOR_NAME, "<anonymous>");
int authorPriority = preferences.getInt(PREFERENCE_AUTHOR_PRIORITY, 0);
String authorName = preferences.getString(HIDDEN_PREFERENCE_AUTHOR_NAME, "<anonymous>");
int authorPriority = preferences.getInt(HIDDEN_PREFERENCE_AUTHOR_PRIORITY, 0);
return new RaceLogEventAuthorImpl(authorName, authorPriority);
}
public BoatClassType getBoatClass() {
String boatClass = preferences.getString(PREFERENCE_BOAT_CLASS, null);
String boatClass = preferences.getString(HIDDEN_PREFERENCE_BOAT_CLASS, null);
if (boatClass == null) {
return null;
}
@@ -77,11 +89,11 @@ public class AppPreferences {
public void setBoatClass(BoatClassType boatClass) {
String boatClassString = boatClass.name();
preferences.edit().putString(PREFERENCE_BOAT_CLASS, boatClassString).commit();
preferences.edit().putString(HIDDEN_PREFERENCE_BOAT_CLASS, boatClassString).commit();
}
public CourseLayouts getCourseLayout() {
String courseLayout = preferences.getString(PREFERENCE_COURSE_LAYOUT, null);
String courseLayout = preferences.getString(HIDDEN_PREFERENCE_COURSE_LAYOUT, null);
if (courseLayout == null)
return null;
CourseLayouts storedCourseLayout;
@@ -97,11 +109,11 @@ public class AppPreferences {
public void setCourseLayout(CourseLayouts courseLayout) {
String courseLayoutString = courseLayout.name();
preferences.edit().putString(PREFERENCE_COURSE_LAYOUT, courseLayoutString).commit();
preferences.edit().putString(HIDDEN_PREFERENCE_COURSE_LAYOUT, courseLayoutString).commit();
}
public NumberOfRounds getNumberOfRounds() {
String numberOfRounds = preferences.getString(PREFERENCE_NUMBER_OF_ROUNDS, null);
String numberOfRounds = preferences.getString(HIDDEN_PREFERENCE_NUMBER_OF_ROUNDS, null);
if (numberOfRounds == null)
return null;
return NumberOfRounds.valueOf(numberOfRounds);
@@ -109,48 +121,39 @@ public class AppPreferences {
public void setNumberOfRounds(NumberOfRounds numberOfRounds) {
String numberOfRoundsString = numberOfRounds.name();
preferences.edit().putString(PREFERENCE_NUMBER_OF_ROUNDS, numberOfRoundsString).commit();
preferences.edit().putString(HIDDEN_PREFERENCE_NUMBER_OF_ROUNDS, numberOfRoundsString).commit();
}
public double getWindBearingFromDirection() {
long windBearingAsLong = preferences.getLong(PREFERENCE_WIND_BEARING, 0);
long windBearingAsLong = preferences.getLong(HIDDEN_PREFERENCE_WIND_BEARING, 0);
return Double.longBitsToDouble(windBearingAsLong);
}
public void setWindBearingFromDirection(double enteredWindBearing) {
long windBearingAsLong = Double.doubleToLongBits(enteredWindBearing);
preferences.edit().putLong(PREFERENCE_WIND_BEARING, windBearingAsLong).commit();
preferences.edit().putLong(HIDDEN_PREFERENCE_WIND_BEARING, windBearingAsLong).commit();
}
public double getWindSpeed() {
long windSpeedAsLong = preferences.getLong(PREFERENCE_WIND_SPEED, 0);
long windSpeedAsLong = preferences.getLong(HIDDEN_PREFERENCE_WIND_SPEED, 0);
return Double.longBitsToDouble(windSpeedAsLong);
}
public void setWindSpeed(double enteredWindSpeed) {
long windSpeedAsLong = Double.doubleToLongBits(enteredWindSpeed);
preferences.edit().putLong(PREFERENCE_WIND_SPEED, windSpeedAsLong).commit();
preferences.edit().putLong(HIDDEN_PREFERENCE_WIND_SPEED, windSpeedAsLong).commit();
}
public List<String> getManagedCourseAreaNames() {
String value = preferences.getString(key(R.string.preference_course_areas_key), "");
String[] managedCourseAreas = value.split(",");
for (int i = 0; i < managedCourseAreas.length; i++) {
managedCourseAreas[i] = managedCourseAreas[i].trim();
}
return Arrays.asList(managedCourseAreas);
Set<String> values = preferences.getStringSet(key(R.string.preference_course_areas_key), new HashSet<String>());
return new ArrayList<String>(values);
}
public void setManagedCourseAreaNames(List<String> courseAreaNames) {
StringBuilder builder = new StringBuilder();
for (String name : courseAreaNames) {
builder.append(name);
builder.append(",");
}
preferences
.edit()
.putString(key(R.string.preference_course_areas_key),
builder.substring(0, builder.length() - 1)).commit();
.putStringSet(key(R.string.preference_course_areas_key),
new HashSet<String>(courseAreaNames)).commit();
}
public String getServerBaseURL() {
@@ -204,40 +207,96 @@ public class AppPreferences {
}
public List<String> getByNameCourseDesignerCourseNames() {
String value = preferences.getString(key(R.string.preference_course_designer_by_name_course_names_key), "");
String[] courseNames = value.split(",");
for (int i = 0; i < courseNames.length; i++) {
courseNames[i] = courseNames[i].trim();
}
return Arrays.asList(courseNames);
Set<String> values = preferences.getStringSet(key(R.string.preference_course_designer_by_name_course_names_key), new HashSet<String>());
return new ArrayList<String>(values);
}
public void setByNameCourseDesignerCourseNames(List<String> courseNames) {
StringBuilder builder = new StringBuilder();
for (String name : courseNames) {
builder.append(name);
builder.append(",");
}
preferences
.edit()
.putString(key(R.string.preference_course_designer_by_name_course_names_key),
builder.substring(0, builder.length() - 1)).commit();
}
private String key(int keyId) {
return context.getString(keyId);
}
public String getAndroidIdentifier() {
return Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
.putStringSet(key(R.string.preference_course_designer_by_name_course_names_key),
new HashSet<String>(courseNames)).commit();
}
public boolean isRacingProcedureConfigurationOverwriteAllowed() {
return preferences.getBoolean(PREFERENCE_PROCEDURE_CONFIG_OVERWRITE, true);
return preferences.getBoolean(HIDDEN_PREFERENCE_PROCEDURE_CONFIG_OVERWRITE, true);
}
public void setRacingProcedureConfigurationOverwriteAllowed(boolean allowed) {
preferences.edit().putBoolean(PREFERENCE_PROCEDURE_CONFIG_OVERWRITE, allowed).commit();
preferences.edit().putBoolean(HIDDEN_PREFERENCE_PROCEDURE_CONFIG_OVERWRITE, allowed).commit();
}
public void setRacingProcedureClassFlag(RacingProcedureType type, Flags flag) {
String key = getRacingProcedureClassFlagKey(type);
preferences.edit().putString(key, flag.name()).commit();
}
public Flags getRacingProcedureClassFlag(RacingProcedureType type) {
String key = getRacingProcedureClassFlagKey(type);
return Flags.valueOf(preferences.getString(key, null));
}
public void setRacingProcedureHasIndividualRecall(RacingProcedureType type, Boolean hasRecall) {
String key = getRacingProcedureHasIndividualRecallKey(type);
preferences.edit().putBoolean(key, hasRecall).commit();
}
public boolean getRacingProcedureHasIndividualRecall(RacingProcedureType type) {
String key = getRacingProcedureHasIndividualRecallKey(type);
return preferences.getBoolean(key, false);
}
public void setRRS26StartmodeFlags(Set<Flags> flags) {
Set<String> flagNames = new HashSet<String>();
for (Flags flag : flags) {
flagNames.add(flag.name());
}
preferences.edit().putStringSet(key(R.string.preference_racing_procedure_rrs26_startmode_flags_key), flagNames);
}
public Set<Flags> getRRS26StartmodeFlags() {
Set<String> flagNames = preferences.getStringSet(key(R.string.preference_racing_procedure_rrs26_startmode_flags_key), null);
if (flagNames != null) {
Set<Flags> flags = new HashSet<Flags>();
for (String flagName : flagNames) {
flags.add(Flags.valueOf(flagName));
}
return flags;
}
return null;
}
private String getRacingProcedureClassFlagKey(RacingProcedureType type) {
String key;
switch (type) {
case RRS26:
key = key(R.string.preference_racing_procedure_rrs26_classflag_key);
break;
case GateStart:
key = key(R.string.preference_racing_procedure_gatestart_classflag_key);
break;
case ESS:
key = key(R.string.preference_racing_procedure_ess_classflag_key);
default:
throw new IllegalArgumentException("Unknown racing procedure type.");
}
return key;
}
private String getRacingProcedureHasIndividualRecallKey(RacingProcedureType type) {
String key;
switch (type) {
case RRS26:
key = key(R.string.preference_racing_procedure_rrs26_hasxray_key);
break;
case GateStart:
key = key(R.string.preference_racing_procedure_gatestart_hasxray_key);
break;
case ESS:
key = key(R.string.preference_racing_procedure_ess_hasxray_key);
default:
throw new IllegalArgumentException("Unknown racing procedure type.");
}
return key;
}
}
@@ -22,6 +22,7 @@ import com.sap.sailing.domain.base.configuration.DeviceConfiguration;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier;
import com.sap.sailing.domain.base.configuration.RacingProceduresConfiguration;
import com.sap.sailing.domain.base.configuration.ConfigurationLoader;
import com.sap.sailing.domain.base.configuration.impl.EmptyRacingProceduresConfiguration;
import com.sap.sailing.domain.base.impl.BoatClassImpl;
import com.sap.sailing.domain.base.impl.CompetitorImpl;
import com.sap.sailing.domain.base.impl.CourseAreaImpl;
@@ -77,7 +78,7 @@ public class OfflineDataManager extends DataManager {
SeriesWithRows qualifying = new SeriesWithRowsImpl("Qualifying", false, null);
SeriesWithRows medal = new SeriesWithRowsImpl("Medal", true, null);
RaceGroup raceGroup = new RaceGroupImpl("ESS", new BoatClassImpl("X40", false), null, Arrays.asList(qualifying,
medal), RacingProcedureType.RRS26, CourseDesignerMode.BY_NAME);
medal), RacingProcedureType.RRS26, CourseDesignerMode.BY_NAME, new EmptyRacingProceduresConfiguration());
List<Competitor> competitors = new ArrayList<Competitor>();
competitors.add(new CompetitorImpl(UUID.randomUUID(), "SAP Extreme Sailing Team", null, null));
@@ -11,20 +11,20 @@ import android.content.Context;
import android.content.Loader;
import android.os.Bundle;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.domain.base.EventBase;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.SharedDomainFactory;
import com.sap.sailing.domain.base.configuration.ConfigurationLoader;
import com.sap.sailing.domain.base.configuration.DeviceConfiguration;
import com.sap.sailing.domain.base.configuration.DeviceConfigurationIdentifier;
import com.sap.sailing.domain.base.configuration.RacingProceduresConfiguration;
import com.sap.sailing.domain.base.configuration.ConfigurationLoader;
import com.sap.sailing.domain.racelog.RaceLogServletConstants;
import com.sap.sailing.racecommittee.app.data.clients.LoadClient;
import com.sap.sailing.racecommittee.app.data.deserialization.impl.PreferencesBasedDeviceConfigurationJsonDeserializer;
import com.sap.sailing.racecommittee.app.data.deserialization.impl.PreferencesBasedRacingProceduresConfigurationJsonDeserializer;
import com.sap.sailing.racecommittee.app.data.handlers.CompetitorsDataHandler;
import com.sap.sailing.racecommittee.app.data.handlers.CourseBaseHandler;
import com.sap.sailing.racecommittee.app.data.handlers.DataHandler;
@@ -55,19 +55,11 @@ import com.sap.sailing.server.gateway.deserialization.coursedata.impl.CourseBase
import com.sap.sailing.server.gateway.deserialization.coursedata.impl.GateDeserializer;
import com.sap.sailing.server.gateway.deserialization.coursedata.impl.MarkDeserializer;
import com.sap.sailing.server.gateway.deserialization.coursedata.impl.WaypointDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.BoatClassJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.ColorDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.CompetitorJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.CourseAreaJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.EventBaseJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.FleetDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.VenueJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.racegroup.impl.RaceCellDeserializer;
import com.sap.sailing.server.gateway.deserialization.racegroup.impl.RaceGroupDeserializer;
import com.sap.sailing.server.gateway.deserialization.racegroup.impl.RaceRowDeserializer;
import com.sap.sailing.server.gateway.deserialization.racegroup.impl.SeriesWithRowsDeserializer;
import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogDeserializer;
import com.sap.sailing.server.gateway.deserialization.racelog.impl.RaceLogEventDeserializer;
/**
* Enables accessing of data.
@@ -142,13 +134,10 @@ public class OnlineDataManager extends DataManager {
ConfigurationLoader<RacingProceduresConfiguration> configuration =
new PreferencesBasedRacingProceduresConfiguration(preferences);
JsonDeserializer<BoatClass> boatClassDeserializer = new BoatClassJsonDeserializer(domainFactory);
JsonDeserializer<RacingProceduresConfiguration> proceduresDeserializer =
PreferencesBasedRacingProceduresConfigurationJsonDeserializer.create(preferences);
DataParser<Collection<ManagedRace>> parser = new ManagedRacesDataParser(preferences.getAuthor(),
configuration,
new RaceGroupDeserializer(boatClassDeserializer, new SeriesWithRowsDeserializer(
new RaceRowDeserializer(new FleetDeserializer(new ColorDeserializer()),
new RaceCellDeserializer(new RaceLogDeserializer(
RaceLogEventDeserializer.create(domainFactory)))))));
configuration, RaceGroupDeserializer.create(domainFactory, proceduresDeserializer));
DataHandler<Collection<ManagedRace>> handler = new ManagedRacesDataHandler(OnlineDataManager.this);
return new OnlineDataLoader<Collection<ManagedRace>>(context, new URL(preferences.getServerBaseURL()
+ "/sailingserver/rc/racegroups?"+
@@ -14,7 +14,7 @@ public class PreferencesBasedDeviceConfigurationJsonDeserializer extends DeviceC
public static PreferencesBasedDeviceConfigurationJsonDeserializer create(final AppPreferences preferences) {
return new PreferencesBasedDeviceConfigurationJsonDeserializer(preferences,
new PreferencesBasedRacingProceduresConfigurationJsonDeserializer(preferences));
PreferencesBasedRacingProceduresConfigurationJsonDeserializer.create(preferences));
}
private final AppPreferences preferences;
@@ -31,7 +31,8 @@ public class PreferencesBasedDeviceConfigurationJsonDeserializer extends DeviceC
(PreferencesBasedRacingProceduresConfiguration) proceduresConfiguration);
}
public PreferencesBasedDeviceConfiguration deserializeAsStored(JSONObject object) throws JsonDeserializationException {
public PreferencesBasedDeviceConfiguration deserializeAsStored(JSONObject object)
throws JsonDeserializationException {
return (PreferencesBasedDeviceConfiguration) deserialize(object);
}
@@ -6,13 +6,24 @@ import com.sap.sailing.domain.base.configuration.impl.RacingProceduresConfigurat
import com.sap.sailing.racecommittee.app.AppPreferences;
import com.sap.sailing.racecommittee.app.domain.configuration.impl.PreferencesBasedRacingProceduresConfiguration;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.impl.ESSConfigurationJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.GateStartConfigurationJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.RRS26ConfigurationJsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.RacingProceduresConfigurationJsonDeserializer;
public class PreferencesBasedRacingProceduresConfigurationJsonDeserializer extends RacingProceduresConfigurationJsonDeserializer {
private final AppPreferences preferences;
public PreferencesBasedRacingProceduresConfigurationJsonDeserializer(AppPreferences preferences) {
public static PreferencesBasedRacingProceduresConfigurationJsonDeserializer create(AppPreferences preferences) {
return new PreferencesBasedRacingProceduresConfigurationJsonDeserializer(preferences, RRS26ConfigurationJsonDeserializer.create(),
GateStartConfigurationJsonDeserializer.create(), ESSConfigurationJsonDeserializer.create());
}
public PreferencesBasedRacingProceduresConfigurationJsonDeserializer(AppPreferences preferences,
RRS26ConfigurationJsonDeserializer rrs26, GateStartConfigurationJsonDeserializer gateStart,
ESSConfigurationJsonDeserializer ess) {
super(rrs26, gateStart, ess);
this.preferences = preferences;
}
@@ -24,14 +24,16 @@ import com.sap.sailing.domain.racelog.state.impl.RaceStateImpl;
import com.sap.sailing.racecommittee.app.domain.FleetIdentifier;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier;
import com.sap.sailing.racecommittee.app.domain.configuration.impl.PreferencesBasedRacingProceduresConfiguration;
import com.sap.sailing.racecommittee.app.domain.impl.FleetIdentifierImpl;
import com.sap.sailing.racecommittee.app.domain.impl.ManagedRaceIdentifierImpl;
import com.sap.sailing.racecommittee.app.domain.impl.ManagedRaceImpl;
import com.sap.sailing.racecommittee.app.logging.ExLog;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.deserialization.impl.Helpers;
public class ManagedRacesDataParser implements DataParser<Collection<ManagedRace>> {
// private static final String TAG = ManagedRacesDataParser.class.getName();
private static final String TAG = ManagedRacesDataParser.class.getName();
private final JsonDeserializer<RaceGroup> deserializer;
private final ConfigurationLoader<RacingProceduresConfiguration> globalConfiguration;
@@ -53,15 +55,21 @@ public class ManagedRacesDataParser implements DataParser<Collection<ManagedRace
JSONObject json = Helpers.toJSONObjectSafe(element);
RaceGroup group = deserializer.deserialize(json);
// TODO: store configuration of RaceGroup!
globalConfiguration.store();
storeRaceGroupLocalConfiguration(group);
addManagedRaces(managedRaces, group);
}
return managedRaces;
}
private void storeRaceGroupLocalConfiguration(RaceGroup group) {
RacingProceduresConfiguration groupConfiguration = group.getRacingProceduresConfiguration();
if (groupConfiguration != null && groupConfiguration instanceof PreferencesBasedRacingProceduresConfiguration) {
ExLog.i(TAG, "Trying to store the RaceGroup's local procedures configuration.");
((PreferencesBasedRacingProceduresConfiguration)groupConfiguration).store();
}
}
private void addManagedRaces(Collection<ManagedRace> target, RaceGroup raceGroup) {
for (SeriesWithRows series : raceGroup.getSeries()) {
for (RaceRow raceRow : series.getRaceRows()) {
@@ -1,8 +1,19 @@
package com.sap.sailing.racecommittee.app.domain.configuration.impl;
import java.util.ArrayList;
import java.util.HashSet;
import com.sap.sailing.domain.base.configuration.RacingProceduresConfiguration;
import com.sap.sailing.domain.base.configuration.ConfigurationLoader;
import com.sap.sailing.domain.base.configuration.impl.ESSConfigurationImpl;
import com.sap.sailing.domain.base.configuration.impl.GateStartConfigurationImpl;
import com.sap.sailing.domain.base.configuration.impl.RRS26ConfigurationImpl;
import com.sap.sailing.domain.base.configuration.impl.RacingProceduresConfigurationImpl;
import com.sap.sailing.domain.base.configuration.procedures.ESSConfiguration;
import com.sap.sailing.domain.base.configuration.procedures.GateStartConfiguration;
import com.sap.sailing.domain.base.configuration.procedures.RRS26Configuration;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.racecommittee.app.AppPreferences;
import com.sap.sailing.racecommittee.app.logging.ExLog;
@@ -20,11 +31,22 @@ public class PreferencesBasedRacingProceduresConfiguration extends RacingProcedu
@Override
public RacingProceduresConfiguration load() {
// TODO: implement loading of RPC
setClassFlag(null);
setHasInidividualRecall(null);
RRS26ConfigurationImpl rrs26 = new RRS26ConfigurationImpl();
rrs26.setClassFlag(preferences.getRacingProcedureClassFlag(RacingProcedureType.RRS26));
rrs26.setHasInidividualRecall(preferences.getRacingProcedureHasIndividualRecall(RacingProcedureType.RRS26));
rrs26.setStartModeFlags(new ArrayList<Flags>(preferences.getRRS26StartmodeFlags()));
setRRS26Configuration(rrs26);
GateStartConfigurationImpl gateStart = new GateStartConfigurationImpl();
gateStart.setClassFlag(preferences.getRacingProcedureClassFlag(RacingProcedureType.GateStart));
gateStart.setHasInidividualRecall(preferences.getRacingProcedureHasIndividualRecall(RacingProcedureType.GateStart));
setGateStartConfiguration(gateStart);
ESSConfigurationImpl ess = new ESSConfigurationImpl();
ess.setClassFlag(preferences.getRacingProcedureClassFlag(RacingProcedureType.ESS));
ess.setHasInidividualRecall(preferences.getRacingProcedureHasIndividualRecall(RacingProcedureType.ESS));
setESSConfiguration(ess);
setStartModeFlags(null);
return copy();
}
@@ -36,19 +58,36 @@ public class PreferencesBasedRacingProceduresConfiguration extends RacingProcedu
}
ExLog.i(TAG, "Storing new racing procedure configuration.");
// TODO: implement storing of RPC
if (getClassFlag() != null) {
if (getRRS26Configuration() != null) {
RRS26Configuration config = getRRS26Configuration();
if (config.getClassFlag() != null) {
preferences.setRacingProcedureClassFlag(RacingProcedureType.RRS26, config.getClassFlag());
}
if (hasInidividualRecall() != null) {
if (config.hasInidividualRecall() != null) {
preferences.setRacingProcedureHasIndividualRecall(RacingProcedureType.RRS26, config.hasInidividualRecall());
}
if (config.getStartModeFlags() != null) {
preferences.setRRS26StartmodeFlags(new HashSet<Flags>(config.getStartModeFlags()));
}
}
if (getGateStartConfiguration() != null) {
GateStartConfiguration config = getGateStartConfiguration();
if (config.getClassFlag() != null) {
preferences.setRacingProcedureClassFlag(RacingProcedureType.GateStart, config.getClassFlag());
}
if (config.hasInidividualRecall() != null) {
preferences.setRacingProcedureHasIndividualRecall(RacingProcedureType.GateStart, config.hasInidividualRecall());
}
}
if (getESSConfiguration() != null) {
ESSConfiguration config = getESSConfiguration();
if (config.getClassFlag() != null) {
preferences.setRacingProcedureClassFlag(RacingProcedureType.ESS, config.getClassFlag());
}
if (config.hasInidividualRecall() != null) {
preferences.setRacingProcedureHasIndividualRecall(RacingProcedureType.ESS, config.hasInidividualRecall());
}
if (getStartModeFlags() != null) {
}
}
}
@@ -1,9 +1,17 @@
package com.sap.sailing.racecommittee.app.ui.fragments.preference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.sap.sailing.racecommittee.app.ui.views.EditSetPreference;
import com.sap.sailing.racecommittee.app.utils.MultiplePreferenceChangeListener;
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;
@@ -14,6 +22,11 @@ import android.preference.PreferenceManager;
*/
public class BasePreferenceFragment extends PreferenceFragment {
@SuppressWarnings("unchecked")
protected <T extends Preference> T findPreference(int resourceId) {
return (T) findPreference(getString(resourceId));
}
protected static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object value) {
@@ -27,6 +40,12 @@ public class BasePreferenceFragment extends PreferenceFragment {
? listPreference.getEntries()[index]
: null);
} else if (preference instanceof MultiSelectListPreference || preference instanceof EditSetPreference) {
@SuppressWarnings("unchecked")
Set<String> setValue = (Set<String>) value;
List<String> listValue = new ArrayList<String>(setValue);
Collections.sort(listValue);
preference.setSummary(listValue.toString());
} else {
preference.setSummary(stringValue);
}
@@ -52,6 +71,15 @@ public class BasePreferenceFragment extends PreferenceFragment {
.getInt(preference.getKey(), 0));
}
protected static void bindPreferenceSummaryToSet(Preference preference) {
addOnPreferenceChangeListener(preference, sBindPreferenceSummaryToValueListener);
sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
PreferenceManager
.getDefaultSharedPreferences(preference.getContext())
.getStringSet(preference.getKey(), new HashSet<String>()));
}
protected static void bindPreferenceToCheckbox(CheckBoxPreference checkboxPreference, final Preference target) {
target.setEnabled(checkboxPreference.isChecked());
addOnPreferenceChangeListener(checkboxPreference, new Preference.OnPreferenceChangeListener() {
@@ -10,6 +10,7 @@ import android.preference.ListPreference;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.ui.views.EditSetPreference;
public class CourseDesignerPreferenceFragment extends BasePreferenceFragment {
@Override
@@ -18,14 +19,19 @@ public class CourseDesignerPreferenceFragment extends BasePreferenceFragment {
addPreferencesFromResource(R.xml.preference_course_designer);
setupCourseDesignerTypePreferences();
bindPreferenceSummaryToValue(findPreference(getString(R.string.preference_course_designer_by_name_course_names_key)));
setupCourseDesignerByNameCourseNames();
bindPreferenceSummaryToSet(findPreference(R.string.preference_course_designer_by_name_course_names_key));
}
private void setupCourseDesignerByNameCourseNames() {
EditSetPreference preference = findPreference(R.string.preference_course_designer_by_name_course_names_key);
preference.setExampleValues(getResources().getStringArray(R.array.preference_course_designer_by_name_course_names_example));
}
private void setupCourseDesignerTypePreferences() {
CheckBoxPreference overrideCourseDesignerPreference = (CheckBoxPreference)
findPreference(getString(R.string.preference_course_designer_is_overridden_key));
final ListPreference courseDesignerPreference = (ListPreference)
findPreference(getString(R.string.preference_course_designer_override_key));
CheckBoxPreference overrideCourseDesignerPreference = findPreference(R.string.preference_course_designer_is_overridden_key);
final ListPreference courseDesignerPreference = findPreference(R.string.preference_course_designer_override_key);
List<CharSequence> entries = new ArrayList<CharSequence>();
List<CharSequence> entryValues = new ArrayList<CharSequence>();
@@ -1,97 +0,0 @@
package com.sap.sailing.racecommittee.app.ui.fragments.preference;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.logging.ExLog;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.preference.DialogPreference;
import android.util.AttributeSet;
public class EditListPreference extends DialogPreference {
private static final String TAG = EditListPreference.class.getName();
private static final Set<String> defaultFallbackValue = new HashSet<String>();
private Set<String> currentValue;
public EditListPreference(Context context, AttributeSet attrs) {
super(context, attrs);
setDialogLayoutResource(R.layout.race_choose_line_opening_time_view);
}
@SuppressWarnings("unchecked")
@Override
protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
if (restorePersistedValue) {
// Restore existing state
currentValue = getPersistedStringSet(defaultFallbackValue);
} else {
// Set default state from the XML attribute
currentValue = (Set<String>) defaultValue;
persistStringSet(currentValue);
}
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
return toSet(a.getString(index));
}
protected static Set<String> toSet(String csl) {
if (csl == null || csl.isEmpty()) {
return new HashSet<String>();
}
String[] values = csl.split(",");
for (int i = 0; i < values.length; i++) {
values[i] = values[i].trim();
}
return new HashSet<String>(Arrays.asList(values));
}
@Override
protected void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
ExLog.i(TAG, "Storing result...");
persistStringSet(currentValue);
}
}
private boolean persistStringSet(Set<String> value) {
if (shouldPersist()) {
// Shouldn't store null
if (value == getPersistedStringSet(null)) {
// It's already there, so the same as persisting
return true;
}
SharedPreferences.Editor editor = getEditor();
editor.putStringSet(getKey(), value);
if (shouldCommit()) {
editor.commit();
}
return true;
}
return false;
}
protected Set<String> getPersistedStringSet(Set<String> defaultReturnValue) {
if (!shouldPersist()) {
return defaultReturnValue;
}
return getSharedPreferences().getStringSet(getKey(), defaultReturnValue);
}
}
@@ -8,6 +8,7 @@ import android.preference.Preference.OnPreferenceChangeListener;
import android.widget.Toast;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.ui.views.EditSetPreference;
public class GeneralPreferenceFragment extends BasePreferenceFragment {
@Override
@@ -17,9 +18,18 @@ public class GeneralPreferenceFragment extends BasePreferenceFragment {
setupLanguageButton();
setupServerUrlBox();
bindPreferenceSummaryToValue(findPreference(getString(R.string.preference_server_url_key)));
bindPreferenceSummaryToValue(findPreference(getString(R.string.preference_course_areas_key)));
bindPreferenceSummaryToValue(findPreference(getString(R.string.preference_mail_key)));
setupCourseAreasList();
bindPreferenceSummaryToValue(findPreference(R.string.preference_server_url_key));
bindPreferenceSummaryToSet(findPreference(R.string.preference_course_areas_key));
bindPreferenceSummaryToValue(findPreference(R.string.preference_mail_key));
}
private void setupCourseAreasList() {
EditSetPreference preference = findPreference(R.string.preference_course_areas_key);
//ReadonlyDataManager dataManager = DataManager.create(getActivity());
preference.setExampleValues(getResources().getStringArray(R.array.preference_course_areas_example));
}
private void setupServerUrlBox() {
@@ -7,7 +7,9 @@ import java.util.List;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.MultiSelectListPreference;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.racecommittee.app.R;
@@ -18,13 +20,32 @@ public class RacingProcedurePreferenceFragment extends BasePreferenceFragment {
addPreferencesFromResource(R.xml.preference_racing_procedure);
setupRacingProcedurePreferences();
setupRRS26();
setupGateStart();
setupESS();
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_gatestart_classflag_key));
bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_ess_classflag_key));
}
private void setupRRS26() {
setupStartmodeFlagsList();
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_rrs26_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 setupRacingProcedurePreferences() {
CheckBoxPreference overrideStartProcedurePreference = (CheckBoxPreference)
findPreference(getString(R.string.preference_racing_procedure_is_overridden_key));
final ListPreference startProcedurePreference = (ListPreference)
findPreference(getString(R.string.preference_racing_procedure_override_key));
CheckBoxPreference overrideStartProcedurePreference = findPreference(R.string.preference_racing_procedure_is_overridden_key);
final ListPreference startProcedurePreference = findPreference(R.string.preference_racing_procedure_override_key);
List<CharSequence> entries = new ArrayList<CharSequence>();
List<CharSequence> entryValues = new ArrayList<CharSequence>();
@@ -33,10 +54,32 @@ public class RacingProcedurePreferenceFragment extends BasePreferenceFragment {
entryValues.add(type.name());
}
startProcedurePreference.setEntries(entries.toArray(new CharSequence[0]));
startProcedurePreference.setEntryValues(entryValues.toArray(new CharSequence[0]));
startProcedurePreference.setEntries(entries.toArray(new CharSequence[entries.size()]));
startProcedurePreference.setEntryValues(entryValues.toArray(new CharSequence[entryValues.size()]));
bindPreferenceToCheckbox(overrideStartProcedurePreference, startProcedurePreference);
bindPreferenceSummaryToValue(startProcedurePreference);
}
private void setupStartmodeFlagsList() {
MultiSelectListPreference listPreference = findPreference(R.string.preference_racing_procedure_rrs26_startmode_flags_key);
List<String> flags = new ArrayList<String>();
for (Flags flag : Flags.validValues()) {
flags.add(flag.name());
}
listPreference.setEntries(flags.toArray(new String[flags.size()]));
listPreference.setEntryValues(flags.toArray(new String[flags.size()]));
}
private void setupClassFlagList(ListPreference preference) {
List<CharSequence> entries = new ArrayList<CharSequence>();
List<CharSequence> entryValues = new ArrayList<CharSequence>();
for (Flags flag: Flags.validValues()) {
entries.add(flag.toString());
entryValues.add(flag.name());
}
preference.setEntries(entries.toArray(new CharSequence[entries.size()]));
preference.setEntryValues(entryValues.toArray(new CharSequence[entryValues.size()]));
}
}
@@ -0,0 +1,153 @@
package com.sap.sailing.racecommittee.app.ui.views;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.preference.DialogPreference;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.ListView;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.logging.ExLog;
import com.sap.sailing.racecommittee.app.utils.ArrayRemoveAdapter;
public class EditSetPreference extends DialogPreference {
private static final String TAG = EditSetPreference.class.getName();
private static final List<String> defaultFallbackValue = new ArrayList<String>();
private List<String> currentValue;
private List<String> exampleValues;
public EditSetPreference(Context context, AttributeSet attrs) {
super(context, attrs);
this.exampleValues = new ArrayList<String>();
setDialogLayoutResource(R.layout.edit_set_preference);
}
public void setExampleValues(String[] values) {
this.exampleValues = Arrays.asList(values);
}
@Override
protected View onCreateDialogView() {
View view = super.onCreateDialogView();
final AutoCompleteTextView inputView = (AutoCompleteTextView) view.findViewById(R.id.edit_set_preference_input);
final Button addButton = (Button) view.findViewById(R.id.edit_set_preference_add);
final ListView listView = (ListView) view.findViewById(R.id.edit_set_preference_list);
// setup list view
final ArrayRemoveAdapter<String> adapter = new ArrayRemoveAdapter<String>(view.getContext(), currentValue);
listView.setEmptyView(view.findViewById(R.id.edit_set_preference_list_empty));
listView.setAdapter(adapter);
// setup inputView
ArrayAdapter<String> autoCompleteAdapter = new ArrayAdapter<String>(view.getContext(), android.R.layout.simple_dropdown_item_1line, exampleValues);
inputView.setAdapter(autoCompleteAdapter);
inputView.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
boolean invalid = s.length() == 0 || currentValue.contains(s.toString());
addButton.setEnabled(!invalid);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
});
// setup add button
addButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Editable text = inputView.getText();
adapter.add(text.toString());
text.clear();
}
});
return view;
}
@SuppressWarnings("unchecked")
@Override
protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
if (restorePersistedValue) {
// Restore existing state
currentValue = getPersistedStringSet(defaultFallbackValue);
} else {
// Set default state from the XML attribute
currentValue = new ArrayList<String>((Set<String>) defaultValue);
persistStringSet(currentValue);
}
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
Set<String> defaultValue = new HashSet<String>();
for (CharSequence chars : a.getTextArray(index)) {
defaultValue.add(chars.toString());
}
return defaultValue;
}
@Override
protected void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
if (callChangeListener(new HashSet<String>(currentValue))) {
ExLog.i(TAG, "Storing result...");
persistStringSet(currentValue);
}
}
}
private boolean persistStringSet(List<String> value) {
if (shouldPersist()) {
// Shouldn't store null
if (value == getPersistedStringSet(null)) {
// It's already there, so the same as persisting
return true;
}
SharedPreferences.Editor editor = getEditor();
editor.putStringSet(getKey(), new HashSet<String>(value));
if (shouldCommit()) {
editor.commit();
}
return true;
}
return false;
}
protected List<String> getPersistedStringSet(List<String> defaultReturnValue) {
if (!shouldPersist()) {
return defaultReturnValue;
}
Set<String> fallbackDefault = defaultReturnValue == null ? null : new HashSet<String>(defaultReturnValue);
Set<String> value = getSharedPreferences().getStringSet(getKey(), fallbackDefault);
return value == null ? null : new ArrayList<String>(value);
}
}
@@ -0,0 +1,65 @@
package com.sap.sailing.racecommittee.app.utils;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.TextView;
import com.sap.sailing.racecommittee.app.R;
public class ArrayRemoveAdapter<T> extends ArrayAdapter<T> {
public interface NotifyDataSetChangedListener<T> {
void onNotifyDataSetChanged(ArrayRemoveAdapter<T> adapter);
}
private NotifyDataSetChangedListener<T> listener;
public ArrayRemoveAdapter(Context context, List<T> objects) {
super(context, R.layout.array_remove_adapter, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.array_remove_adapter, parent, false);
}
TextView text = (TextView) convertView.findViewById(android.R.id.text1);
ImageButton button = (ImageButton) convertView.findViewById(R.id.array_remove_adapter_remove);
final T item = getItem(position);
text.setText(item.toString());
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
remove(item);
}
});
return convertView;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
if (listener != null) {
listener.onNotifyDataSetChanged(this);
}
}
public NotifyDataSetChangedListener<T> getDataSetChangedListener() {
return listener;
}
public void setDataSetChangedListener(NotifyDataSetChangedListener<T> listener) {
this.listener = listener;
}
}