see https://bugzilla.sapsailing.com/bugzilla/show_bug.cgi?id=6096#c2;
The regular expression demanded a three-letter acronym at the beginning
of the sail ID; this has been relaxed now, and now the "default
nationality" coming from the competitor is finally being used for
match-making when the sail ID only has the number.
There are still some places to work on e.g. where the secured DTO's are not in place when we init a settings with context. They are marked with TODO bug5774.
Also the secured ENUM setting needs some attention...
In LiveRaceWithRacemapAndLeaderBoardPresenterImpl there is already a change were we get a StrippedLeaderboardDTO to init context object correctly and which can be used for authorization check later.
- introduced a context object for child settings in settings classes, because of abstract super call hierarchy it was not possible to use data from outside.
- reverted changes with paywall resolver and secured DTO proxies, because potentially not needed
- Added a new documentation page under HowTo -> Development -> Secured Settings
- Cleaned up some RaceMapSetting initializations by using the newly introduced builder
- Added a PaywallResolverProxy
- Used the PaywallResolverProxy and SecuredDTOProxy to make it possible to add the underlying objects to a later time
- Refactored some field naming, especially the name of setting fields
- Changed the getValue() method of a setting to return the default value if value is null (background was the casting of NULL values to atomar return parameters like boolean or int, also a default value was set)
- Added a setValue method without permission check to be used for reset to default method, which will not be overwritten by other implementations of the AbstractValueSetting, which causes some exceptions before.
- Added log messages if a value of an secured value setting is used without paywall resolver or secured DTO
in particular, java.util.function.Predicate won't work below API level
24, and our minSdk is 16 (Android 4.x). 24 would be Android 7.x.
Using a dedicated @FunctionalInterface with a boolean test(T) method
does the trick.