- The result list can now be edited without a finish time.
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalMessages.java
index 2218004f08c..52e9c7fddb0 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalMessages.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalMessages.java
@@ -26,8 +26,6 @@ public interface AnniversaryLegalMessages extends Messages{
String anniversaryLegalNoticeSectionContestParagraph(int anniversary);
String anniversaryLegalNoticeSectionCommunicationParagraphTitle();
String anniversaryLegalNoticeSectionCommunicationParagraph();
- String anniversaryLegalNoticeSectionCharitablyPurposeParagraphTitle();
- String anniversaryLegalNoticeSectionCharitablyPurposeParagraph();
String anniversaryLegalNoticeSectionPrizesParagraphTitle();
String anniversaryLegalNoticeSectionPrizesParagraph(int anniversary);
String anniversaryLegalNoticeSectionPersonalDataAndRightsToImagesParagraphTitle();
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalMessages.properties
index 2f61292ba8b..39e8f81bd47 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalMessages.properties
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalMessages.properties
@@ -7,18 +7,16 @@ anniversaryLegalNoticeSectionOrganizationAndParticipationParagraph3=The organize
anniversaryLegalNoticeSectionRequirementsHeadline=Prerequisites
anniversaryLegalNoticeSectionRequirementsListItem1=SAP Sailing Analytics must be responsible for the live data analysis of each race.
anniversaryLegalNoticeSectionRequirementsListItem2=To win the prize, a race must enter into the regatta evaluation and be finished.
-anniversaryLegalNoticeSectionRequirementsListItem3=The \u20AC10,000 are to be used solely for charitable purposes.
+anniversaryLegalNoticeSectionRequirementsListItem3=The prize money is used solely for the purpose of paying catering (food, beverage, service).
anniversaryLegalNoticeSectionContestParagraphTitle=Contest
anniversaryLegalNoticeSectionContestParagraph=The contest will run until the {0,number,#,###}th race has begun.
anniversaryLegalNoticeSectionCommunicationParagraphTitle=Notification
anniversaryLegalNoticeSectionCommunicationParagraph=The winner will be automatically announced at www.sapsailing.com.
-anniversaryLegalNoticeSectionCharitablyPurposeParagraphTitle=Charitable purposes
-anniversaryLegalNoticeSectionCharitablyPurposeParagraph=The charitable purpose for which the prize is to be used must fulfill certain requirements. The winner must invest the prize in promoting sports, education, literature, the public good, health and safety, the fight against poverty, or similar aims without attempting to gain any private benefit, profit, or political influence.
anniversaryLegalNoticeSectionPrizesParagraphTitle=Prizes
anniversaryLegalNoticeSectionPrizesParagraph=The organizer of the {0,number,#,###}th race will receive the prize money.
anniversaryLegalNoticeSectionPersonalDataAndRightsToImagesParagraphTitle=Personal data and image rights
anniversaryLegalNoticeSectionPersonalDataAndRightsToImagesParagraph1=By participating in the contest, each organizer grants permission (and warrants to have received corresponding consent from its members) to the organizer, its subsidiaries and affiliated businesses, respective licensees, successors, and assignees to use the contest winner''s name, likeness, and entry for purposes of advertising and trade without further notice, consent, or compensation with regard to the contest and the event at which the contest took place, unless prohibited by law. This includes printing, publishing, broadcasting, distributing, and using the contest winner''s name, portrait, picture, voice, likeness, or image (or statements from associated members about the contest) for promotional purposes in any media now known or hereafter arising anywhere in the world.
-anniversaryLegalNoticeSectionPersonalDataAndRightsToImagesParagraph2=SAP SE has set the total sum at \u20AC10,000. Event organizers must propose a charitable purpose for which they plan to use the prize to SAP SE. SAP SE reserves the right to approve these proposals or reject them should they not be deemed charitable.
+anniversaryLegalNoticeSectionPersonalDataAndRightsToImagesParagraph2=SAP SE has set the total sum at \u20AC3,000. Event organizers must propose a catering plan to SAP SE. SAP SE reserves the right to approve the proposal or reject it.
anniversaryLegalNoticeSectionDisclaimerSectionParagraphTitle=Disclaimer
anniversaryLegalNoticeSectionDisclaimerSectionParagraph=SAP will assume no responsibility or liability for incomplete, inaccurate, or misdirected entries.
anniversaryLegalNoticeSectionOtherParagraphTitle=Additional information
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalNoticeBubbleContent.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalNoticeBubbleContent.ui.xml
index 24b2d97ea69..ff67e8f1055 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalNoticeBubbleContent.ui.xml
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/partials/anniversary/AnniversaryLegalNoticeBubbleContent.ui.xml
@@ -41,10 +41,6 @@
-
-
-
-
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaConfigurationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaConfigurationDialog.java
index 30e77991424..4c832da3c12 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaConfigurationDialog.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaConfigurationDialog.java
@@ -23,12 +23,13 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO.RegattaConfigurationDTO;
import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO.RegattaConfigurationDTO.RacingProcedureConfigurationDTO;
+import com.sap.sse.common.Duration;
+import com.sap.sse.gwt.client.controls.IntegerBox;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class RegattaConfigurationDialog extends DataEntryDialog {
private final AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
-
private final StringMessages stringMessages;
private final DeviceConfigurationDTO.RegattaConfigurationDTO originalConfiguration;
@@ -36,6 +37,7 @@ public class RegattaConfigurationDialog extends DataEntryDialog implements R
}
private void updateVisibleSeries() {
- List currentSeries = Arrays.asList(chart.getSeries());
- Set visibleSeries = new HashSet(currentSeries);
+ final Set visibleSeries = new HashSet(Arrays.asList(chart.getSeries()));
if (preselectFilter != null) {
forceSeriesSelection(visibleSeries, windSourceDirectionSeries);
forceSeriesSelection(visibleSeries, windSourceSpeedSeries);
} else {
- if (settings.isShowWindDirectionsSeries()) {
- for (Map.Entry e : windSourceDirectionSeries.entrySet()) {
- Series series = e.getValue();
- if (settings.getWindDirectionSourcesToDisplay().contains(e.getKey().getType())) {
- if (!visibleSeries.contains(series)) {
- chart.addSeries(series, false, false);
- }
- series.select(true); // ensures that the checkbox will be ticked
- series.setVisible(true); //and that it is actually being rendered
- } else {
- if (visibleSeries.contains(series)) {
- chart.removeSeries(series, false);
- }
- }
- }
- } else {
- for (Map.Entry e : windSourceDirectionSeries.entrySet()) {
- Series series = e.getValue();
- if (visibleSeries.contains(series)) {
- chart.removeSeries(series, false);
- }
- }
- }
-
- if (settings.isShowWindSpeedSeries()) {
- for (Map.Entry e : windSourceSpeedSeries.entrySet()) {
- Series series = e.getValue();
- if (settings.getWindSpeedSourcesToDisplay().contains(e.getKey().getType())) {
- if (!visibleSeries.contains(series)) {
- chart.addSeries(series, false, false);
- }
- series.select(true); // ensures that the checkbox will be ticked
- series.setVisible(true); //and that it is actually being rendered
- } else {
- if (visibleSeries.contains(series)) {
- chart.removeSeries(series, false);
- }
- }
- }
- } else {
- for (Map.Entry e : windSourceSpeedSeries.entrySet()) {
- Series series = e.getValue();
- if (visibleSeries.contains(series)) {
- chart.removeSeries(series, false);
- }
- }
- }
+ final boolean showDirectionSeries = settings.isShowWindDirectionsSeries();
+ final Set directionSourceTypesToDisplay = settings.getWindDirectionSourcesToDisplay();
+ updateSeries(visibleSeries, windSourceDirectionSeries, showDirectionSeries, directionSourceTypesToDisplay);
+ final boolean showSpeedSeries = settings.isShowWindSpeedSeries();
+ final Set speedSourceTypesToDisplay = settings.getWindSpeedSourcesToDisplay();
+ updateSeries(visibleSeries, windSourceSpeedSeries, showSpeedSeries, speedSourceTypesToDisplay);
}
onResize();
}
+ private void updateSeries(final Set visibleSeries, final Map windSourceToSeriesMap,
+ final boolean showSeries, final Set windSourceTypesToDisplay) {
+ if (showSeries) {
+ for (Entry entry : windSourceToSeriesMap.entrySet()) {
+ final Series series = entry.getValue();
+ if (windSourceTypesToDisplay.contains(entry.getKey().getType())) {
+ if (!visibleSeries.contains(series)) {
+ chart.addSeries(series, false, false);
+ }
+ } else if (visibleSeries.contains(series)) {
+ chart.removeSeries(series, false);
+ }
+ }
+ } else {
+ for (Entry entry : windSourceToSeriesMap.entrySet()) {
+ final Series series = entry.getValue();
+ if (visibleSeries.contains(series)) {
+ chart.removeSeries(series, false);
+ }
+ }
+ }
+ }
+
private boolean forceSeriesSelection(Set visibleSeries, Map toProcess) {
boolean wasInResult = false;
for (Map.Entry e : toProcess.entrySet()) {
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java
index e04b91da779..f8465a82e18 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java
@@ -5418,6 +5418,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
dto.defaultRacingProcedureType = configuration.getDefaultRacingProcedureType();
dto.defaultCourseDesignerMode = configuration.getDefaultCourseDesignerMode();
+ dto.defaultProtestTimeDuration = configuration.getDefaultProtestTimeDuration();
if (configuration.getRRS26Configuration() != null) {
dto.rrs26Configuration = new DeviceConfigurationDTO.RegattaConfigurationDTO.RRS26ConfigurationDTO();
@@ -5475,6 +5476,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
RegattaConfigurationImpl configuration = new RegattaConfigurationImpl();
configuration.setDefaultRacingProcedureType(dto.defaultRacingProcedureType);
configuration.setDefaultCourseDesignerMode(dto.defaultCourseDesignerMode);
+ configuration.setDefaultProtestTimeDuration(dto.defaultProtestTimeDuration);
if (dto.rrs26Configuration != null) {
RRS26ConfigurationImpl config = new RRS26ConfigurationImpl();
applyGeneralRacingProcedureConfigProperties(dto.rrs26Configuration, config);
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationDTO.java
index 4a8244a7f72..cb56068911b 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationDTO.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/DeviceConfigurationDTO.java
@@ -6,6 +6,7 @@ import com.google.gwt.user.client.rpc.IsSerializable;
import com.sap.sailing.domain.common.CourseDesignerMode;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
+import com.sap.sse.common.Duration;
public class DeviceConfigurationDTO implements IsSerializable {
@@ -40,6 +41,7 @@ public class DeviceConfigurationDTO implements IsSerializable {
}
public RacingProcedureType defaultRacingProcedureType;
public CourseDesignerMode defaultCourseDesignerMode;
+ public Duration defaultProtestTimeDuration;
public RRS26ConfigurationDTO rrs26Configuration;
public SWCStartConfigurationDTO swcStartConfiguration;
diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/RegattaConfigurationJsonDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/RegattaConfigurationJsonDeserializer.java
index 441db44ff05..c8522a4c2d7 100644
--- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/RegattaConfigurationJsonDeserializer.java
+++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/RegattaConfigurationJsonDeserializer.java
@@ -15,9 +15,10 @@ import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException;
import com.sap.sailing.server.gateway.deserialization.JsonDeserializer;
import com.sap.sailing.server.gateway.serialization.impl.RegattaConfigurationJsonSerializer;
+import com.sap.sse.common.impl.MillisecondsDurationImpl;
public class RegattaConfigurationJsonDeserializer implements JsonDeserializer {
-
+
public static RegattaConfigurationJsonDeserializer create() {
return new RegattaConfigurationJsonDeserializer(RRS26ConfigurationJsonDeserializer.create(), SWCStartConfigurationJsonDeserializer.create(),
GateStartConfigurationJsonDeserializer.create(), ESSConfigurationJsonDeserializer.create(),
@@ -30,8 +31,8 @@ public class RegattaConfigurationJsonDeserializer implements JsonDeserializer rrs26Serializer;
private final JsonSerializer swcStartSerializer;
private final JsonSerializer gateStartSerializer;
@@ -47,9 +48,15 @@ public class RegattaConfigurationJsonSerializer implements JsonSerializer()));
+ getPreferenceManager().getSharedPreferences().getStringSet(preference.getKey(), new HashSet()));
}
- protected static void bindPreferenceToCheckbox(CheckBoxPreference checkboxPreference, final Preference target) {
+ protected void bindPreferenceToCheckbox(CheckBoxPreference checkboxPreference, final Preference target) {
target.setEnabled(checkboxPreference.isChecked());
addOnPreferenceChangeListener(checkboxPreference, new Preference.OnPreferenceChangeListener() {
@Override
@@ -91,7 +84,7 @@ public class BasePreferenceFragment extends PreferenceFragment {
});
}
- protected static void bindPreferenceToListEntry(Preference preference, final String defaultValue) {
+ protected void bindPreferenceToListEntry(Preference preference, final String defaultValue) {
final ListPreference listPreference = (ListPreference) preference;
if (listPreference.getValue() == null) {
listPreference.setValue(defaultValue);
@@ -111,7 +104,7 @@ public class BasePreferenceFragment extends PreferenceFragment {
});
}
- protected static void addOnPreferenceChangeListener(Preference preference, OnPreferenceChangeListener newListener) {
+ protected void addOnPreferenceChangeListener(Preference preference, OnPreferenceChangeListener newListener) {
OnPreferenceChangeListener oldListener = preference.getOnPreferenceChangeListener();
if (oldListener == null) {
MultiplePreferenceChangeListener multiListener = new MultiplePreferenceChangeListener();
diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/util/NotificationHelper.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/util/NotificationHelper.java
new file mode 100644
index 00000000000..4bc5834d710
--- /dev/null
+++ b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/util/NotificationHelper.java
@@ -0,0 +1,56 @@
+package com.sap.sailing.android.shared.util;
+
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.support.v4.app.NotificationCompat;
+
+public class NotificationHelper {
+
+ private static final int NOTIFICATION_ID = 13062018;
+ private static Bitmap largeIcon;
+ private static CharSequence title;
+ private static int smallIcon;
+
+ public static void prepareNotificationWith(CharSequence appTitle, Bitmap appIcon, int notificationIcon) {
+ title = appTitle;
+ largeIcon = appIcon;
+ smallIcon = notificationIcon;
+ }
+
+ public static Notification getNotification(Context context) {
+ return getNotification(context, title, "");
+ }
+
+ public static Notification getNotification(Context context, CharSequence customTitle, String content) {
+ return getNotification(context, customTitle, content, null);
+ }
+
+
+ public static Notification getNotification(Context context, CharSequence customTitle, String content, PendingIntent intent) {
+ return getNotification(context, customTitle, content, intent, Notification.COLOR_DEFAULT);
+ }
+
+ public static Notification getNotification(Context context, CharSequence customTitle, String content, PendingIntent intent, int color) {
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
+ .setContentText(content)
+ .setContentTitle(customTitle)
+ .setLargeIcon(largeIcon)
+ .setSmallIcon(smallIcon)
+ .setOngoing(true)
+ .setColor(color)
+ .setPriority(Notification.PRIORITY_HIGH);
+
+ if (intent != null) {
+ builder.setContentIntent(intent);
+ }
+
+ return builder.build();
+ }
+
+
+ public static int getNotificationId() {
+ return NOTIFICATION_ID;
+ }
+}
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TrackingService.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TrackingService.java
index 9b6745e6c50..52adec47487 100755
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TrackingService.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/services/TrackingService.java
@@ -15,12 +15,10 @@ import org.json.JSONException;
import org.json.JSONObject;
import android.app.Notification;
-import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
-import android.graphics.BitmapFactory;
import android.hardware.GeomagneticField;
import android.location.Location;
import android.location.LocationListener;
@@ -33,12 +31,12 @@ import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
-import android.support.v4.app.NotificationCompat;
import android.widget.Toast;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.services.sending.MessageSendingService;
import com.sap.sailing.android.shared.ui.customviews.GPSQuality;
+import com.sap.sailing.android.shared.util.NotificationHelper;
import com.sap.sailing.android.tracking.app.BuildConfig;
import com.sap.sailing.android.tracking.app.R;
import com.sap.sailing.android.tracking.app.ui.activities.TrackingActivity;
@@ -64,7 +62,6 @@ public class TrackingService extends Service implements LocationListener {
private static final int GREAT_DISTANCE = 10;
private static final int NO_DISTANCE = 0;
- private NotificationManager notificationManager;
private AppPreferences prefs;
private GPSQualityListener gpsQualityListener;
@@ -127,7 +124,6 @@ public class TrackingService extends Service implements LocationListener {
locationsQueuedBasedOnSendingInterval = new LinkedHashMap<>();
prefs = new AppPreferences(this);
- notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}
@@ -342,7 +338,7 @@ public class TrackingService extends Service implements LocationListener {
@Override
public void onDestroy() {
stopTracking();
- notificationManager.cancel(NOTIFICATION_ID);
+ stopForeground(false);
Toast.makeText(this, R.string.tracker_stopped, Toast.LENGTH_SHORT).show();
}
@@ -387,16 +383,15 @@ public class TrackingService extends Service implements LocationListener {
private void showNotification() {
Intent intent = new Intent(this, TrackingActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
- PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
- Notification notification = new NotificationCompat.Builder(this)
- .setContentTitle(getText(R.string.app_name))
- .setContentText(getString(R.string.tracking_notification_text, event.name))
- .setContentIntent(pi)
- .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
- .setSmallIcon(R.drawable.ic_directions_boat)
- .setOngoing(true)
- .build();
- notificationManager.notify(NOTIFICATION_ID, notification);
+ PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
+
+ Notification notification = NotificationHelper.getNotification(
+ this,
+ getText(R.string.app_name),
+ getString(R.string.tracking_notification_text, event.name),
+ pendingIntent
+ );
+ startForeground(NotificationHelper.getNotificationId(), notification);
}
public void registerGPSQualityListener(GPSQualityListener listener) {
diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/StartActivity.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/StartActivity.java
index 750e8de0edf..df85fa03e80 100644
--- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/StartActivity.java
+++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/StartActivity.java
@@ -6,6 +6,7 @@ import com.sap.sailing.android.shared.data.BaseCheckinData;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.ui.activities.AbstractStartActivity;
import com.sap.sailing.android.shared.util.EulaHelper;
+import com.sap.sailing.android.shared.util.NotificationHelper;
import com.sap.sailing.android.tracking.app.R;
import com.sap.sailing.android.tracking.app.ui.fragments.HomeFragment;
import com.sap.sailing.android.tracking.app.utils.AboutHelper;
@@ -19,6 +20,8 @@ import com.sap.sailing.android.tracking.app.valueobjects.MarkCheckinData;
import com.sap.sailing.android.ui.fragments.AbstractHomeFragment;
import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Menu;
@@ -49,6 +52,11 @@ public class StartActivity extends AbstractStartActivity {
if (!EulaHelper.with(this).isEulaAccepted()) {
EulaHelper.with(this).showEulaDialog(R.style.AppTheme_AlertDialog);
}
+
+ Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
+ int smallIcon = R.drawable.ic_directions_boat;
+ CharSequence title = getText(R.string.app_name);
+ NotificationHelper.prepareNotificationWith(title, largeIcon, smallIcon);
}
@Override
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml
index 7d1cae96233..9d76b3b5bdc 100644
--- a/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml
+++ b/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml
@@ -536,6 +536,7 @@
Die App konnte keine Verbindung zu SAP Sailing hergestellt.\nPrüfen Sie bitte, ob Sie eine stabile Mobilfunkverbindung haben.\nWollen Sie es erneut versuchen?
Wiederholen
Beenden
+ Server ändern
Dieser Teilnehmer wurde an einem anderen Gerät verändert und hat überschneidende Änderungen. Bitte stellen Sie sicher, dass die Daten korrekt sind.
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/preferences.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/preferences.xml
index ecffc95bc95..d3fa54339b4 100644
--- a/mobile/com.sap.sailing.racecommittee.app/res/values/preferences.xml
+++ b/mobile/com.sap.sailing.racecommittee.app/res/values/preferences.xml
@@ -115,6 +115,9 @@
true
protestTimeDuration
90
+ protestTimeDurationCustom
+ protestTimeDurationCustomEditable
+ true
allow_demo
false
diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml
index cd8ec47c008..527d4d92de8 100644
--- a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml
+++ b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml
@@ -429,7 +429,7 @@
Use previously published course design?
Please enter a valid number
Please enter a valid pathfinder
- Error scanning QR code (%i)
+ Error scanning QR code (%d)
Malformed url
Marks: %s
No course available to copy
@@ -565,6 +565,7 @@
The App couldn\'t establish a connection to SAP Sailing.\nPlease check if you have a stable mobile connection.\nDo you want to retry?
Retry
Exit
+ Change Server
This competitor was changed from another device and you have changed the same data. Please be sure, that this data is correct now.
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java
index 6163b76620b..bd09f5fe40d 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/AppPreferences.java
@@ -5,16 +5,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.preference.PreferenceManager;
-import android.provider.Settings.Secure;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.text.TextUtils;
-
import com.google.android.gms.maps.model.LatLng;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
@@ -29,6 +19,16 @@ import com.sap.sailing.racecommittee.app.domain.coursedesign.NumberOfRounds;
import com.sap.sailing.racecommittee.app.domain.coursedesign.TrapezoidCourseLayouts;
import com.sap.sailing.racecommittee.app.domain.coursedesign.WindWardLeeWardCourseLayouts;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.preference.PreferenceManager;
+import android.provider.Settings.Secure;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+
/**
* Wrapper for {@link SharedPreferences} for all hidden and non-hidden preferences and state variables.
*/
@@ -497,13 +497,32 @@ public class AppPreferences {
.getInteger(R.integer.preference_dependent_races_offset_default));
}
- public int getProtestTimeDuration() {
+ public int getProtestTimeDurationInMinutes() {
return helper.getInt(context.getString(R.string.preference_protest_time_duration_key), context.getResources()
.getInteger(R.integer.preference_protest_time_duration_default));
}
- public void setProtestTimeDuration(int value) {
- helper.getEditor().putInt(context.getString(R.string.preference_protest_time_duration_key), value).commit();
+ public int getProtestTimeDurationInMinutesCustom() {
+ return helper.getInt(context.getString(R.string.preference_protest_time_duration_custom_key), -1);
+ }
+
+ public boolean isDefaultProtestTimeCustomEditable() {
+ return helper.getBoolean(context.getString(R.string.preference_protest_time_duration_custom_editable_key),
+ context.getResources().getBoolean(R.bool.preference_protest_time_duration_custom_editable_default));
+ }
+
+ public void setDefaultProtestTimeDurationInMinutes(int protestTimeInMinutes) {
+ helper.getEditor().putInt(context.getString(R.string.preference_protest_time_duration_key), protestTimeInMinutes).commit();
+ }
+
+ public void setDefaultProtestTimeDurationInMinutesCustom(int protestTimeInMinutest) {
+ helper.getEditor().putInt(context.getString(R.string.preference_protest_time_duration_custom_key), protestTimeInMinutest).commit();
+ }
+
+ public void setDefaultProtestTimeDurationInMinutesCustomEditable(boolean editable) {
+ helper.getEditor()
+ .putBoolean(context.getString(R.string.preference_protest_time_duration_custom_editable_key), editable)
+ .commit();
}
public String getTheme() {
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/configuration/impl/PreferencesRegattaConfigurationLoader.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/configuration/impl/PreferencesRegattaConfigurationLoader.java
index 14c128f623b..b23efef1801 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/configuration/impl/PreferencesRegattaConfigurationLoader.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/configuration/impl/PreferencesRegattaConfigurationLoader.java
@@ -21,6 +21,7 @@ import com.sap.sailing.domain.base.configuration.procedures.RRS26Configuration;
import com.sap.sailing.domain.base.configuration.procedures.SWCStartConfiguration;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.racecommittee.app.AppPreferences;
+import com.sap.sse.common.Duration;
public class PreferencesRegattaConfigurationLoader implements ConfigurationLoader {
@@ -48,6 +49,7 @@ public class PreferencesRegattaConfigurationLoader implements ConfigurationLoade
configuration.setDefaultRacingProcedureType(preferences.getDefaultRacingProcedureType());
configuration.setDefaultCourseDesignerMode(preferences.getDefaultCourseDesignerMode());
+ configuration.setDefaultProtestTimeDuration(Duration.ONE_MINUTE.times(preferences.getProtestTimeDurationInMinutes()));
RRS26ConfigurationImpl rrs26 = new RRS26ConfigurationImpl();
rrs26.setClassFlag(preferences.getRacingProcedureClassFlag(RacingProcedureType.RRS26));
@@ -104,6 +106,13 @@ public class PreferencesRegattaConfigurationLoader implements ConfigurationLoade
preferences.setDefaultCourseDesignerMode(configuration.getDefaultCourseDesignerMode());
}
+ if (configuration.getDefaultProtestTimeDuration() != null) {
+ preferences.setDefaultProtestTimeDurationInMinutes((int) configuration.getDefaultProtestTimeDuration().asMinutes());
+ preferences.setDefaultProtestTimeDurationInMinutesCustomEditable(false);
+ } else {
+ preferences.setDefaultProtestTimeDurationInMinutesCustomEditable(true);
+ }
+
if (configuration.getRRS26Configuration() != null) {
RRS26Configuration config = configuration.getRRS26Configuration();
storeRacingProcedureConfiguration(RacingProcedureType.RRS26, config);
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateService.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateService.java
index eb643430c13..c35fdfee6a6 100755
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateService.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/services/RaceStateService.java
@@ -9,6 +9,7 @@ import java.util.Map.Entry;
import java.util.Set;
import com.sap.sailing.android.shared.logging.ExLog;
+import com.sap.sailing.android.shared.util.NotificationHelper;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor;
import com.sap.sailing.domain.abstractlog.race.impl.RaceLogChangedVisitor;
@@ -33,6 +34,7 @@ import com.sap.sse.common.impl.MillisecondsTimePoint;
import android.annotation.TargetApi;
import android.app.AlarmManager;
+import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
@@ -60,8 +62,6 @@ public class RaceStateService extends Service {
}
}
- private final static int NOTIFICATION_ID = 42;
-
private final IBinder mBinder = new RaceStateServiceBinder();
private AlarmManager alarmManager;
@@ -75,9 +75,6 @@ public class RaceStateService extends Service {
private Map>> managedIntents;
- private NotificationManager notificationManager;
- private NotificationCompat.Builder notificationBuilder;
-
@Override
public void onCreate() {
this.alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
@@ -87,26 +84,22 @@ public class RaceStateService extends Service {
this.registeredStateEventSchedulers = new HashMap<>();
this.managedIntents = new HashMap<>();
- notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- setupNotificationBuilder();
-
super.onCreate();
+
+ Notification notification = setupNotification(null);
+ startForeground(NotificationHelper.getNotificationId(), notification);
ExLog.i(this, TAG, "Started.");
}
- private void setupNotificationBuilder() {
+ private Notification setupNotification(String customContent) {
Intent launcherIntent = new Intent(this, LoginActivity.class);
launcherIntent.setAction(Intent.ACTION_MAIN);
launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, launcherIntent, 0);
- notificationBuilder = new NotificationCompat.Builder(this)
- .setSmallIcon(R.drawable.ic_boat_white_24dp)
- .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
- .setContentTitle(getText(R.string.service_info))
- .setContentText(getString(R.string.service_text_no_races))
- .setContentIntent(contentIntent)
- .setColor(getResources().getColor(R.color.constant_sap_blue_1))
- .setOngoing(true);
+ CharSequence title = getText(R.string.service_info);
+ String content = customContent != null ? customContent : getString(R.string.service_text_no_races);
+ int color = getResources().getColor(R.color.constant_sap_blue_1);
+ return NotificationHelper.getNotification(this, title, content, contentIntent, color);
}
@Override
@@ -130,7 +123,7 @@ public class RaceStateService extends Service {
@Override
public void onDestroy() {
unregisterAllRaces();
-
+ stopForeground(false);
super.onDestroy();
}
@@ -282,10 +275,9 @@ public class RaceStateService extends Service {
private void updateNotification() {
int numRaces = managedIntents.keySet().size();
- notificationManager.notify(NOTIFICATION_ID, notificationBuilder
- .setContentText(getString(R.string.service_text_num_races, numRaces))
- .build());
- startForeground(NOTIFICATION_ID, notificationBuilder.build());
+ String content = getString(R.string.service_text_num_races, numRaces);
+ Notification notification = setupNotification(content);
+ startForeground(NotificationHelper.getNotificationId(), notification);
}
public void registerRace(ManagedRace race) {
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java
old mode 100644
new mode 100755
index caf9a3de7fe..c03d9b12ab5
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/activities/LoginActivity.java
@@ -6,28 +6,8 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.UUID;
-import android.animation.Animator;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.animation.ValueAnimator;
-import android.app.Fragment;
-import android.app.FragmentTransaction;
-import android.app.LoaderManager.LoaderCallbacks;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.os.Handler;
-import android.support.annotation.NonNull;
-import android.support.v4.content.LocalBroadcastManager;
-import android.support.v7.app.AlertDialog;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.widget.Button;
-import android.widget.Toast;
-
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.sap.sailing.android.shared.logging.ExLog;
@@ -35,6 +15,7 @@ import com.sap.sailing.android.shared.util.AppUtils;
import com.sap.sailing.android.shared.util.BroadcastManager;
import com.sap.sailing.android.shared.util.EulaHelper;
import com.sap.sailing.android.shared.util.NetworkHelper;
+import com.sap.sailing.android.shared.util.NotificationHelper;
import com.sap.sailing.android.shared.util.ViewHelper;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.EventBase;
@@ -66,6 +47,28 @@ import com.sap.sailing.racecommittee.app.utils.QRHelper;
import com.sap.sailing.racecommittee.app.utils.StringHelper;
import com.sap.sailing.racecommittee.app.utils.autoupdate.AutoUpdater;
+import android.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.app.Fragment;
+import android.app.FragmentTransaction;
+import android.app.LoaderManager.LoaderCallbacks;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.annotation.NonNull;
+import android.support.v4.content.LocalBroadcastManager;
+import android.support.v7.app.AlertDialog;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.AccelerateDecelerateInterpolator;
+import android.widget.Button;
+import android.widget.Toast;
+
public class LoginActivity extends BaseActivity
implements EventSelectedListenerHost, CourseAreaSelectedListenerHost, PositionSelectedListenerHost, DialogListenerHost.DialogResultListener {
@@ -334,6 +337,11 @@ public class LoginActivity extends BaseActivity
if (!EulaHelper.with(this).isEulaAccepted()) {
EulaHelper.with(this).showEulaDialog(R.style.AppTheme_AlertDialog);
}
+
+ Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
+ int smallIcon = R.drawable.ic_boat_white_24dp;
+ CharSequence title = getText(R.string.app_name);
+ NotificationHelper.prepareNotificationWith(title, largeIcon, smallIcon);
}
@Override
@@ -407,6 +415,7 @@ public class LoginActivity extends BaseActivity
public void onLoadFailed(Exception reason) {
dismissProgressSpinner();
+ preferences.setDefaultProtestTimeDurationInMinutesCustomEditable(true);
if (reason instanceof FileNotFoundException) {
Toast.makeText(getApplicationContext(), getString(R.string.loading_configuration_not_found), Toast.LENGTH_LONG).show();
ExLog.w(LoginActivity.this, TAG, String.format("There seems to be no configuration for this device: %s", reason.toString()));
@@ -513,11 +522,11 @@ public class LoginActivity extends BaseActivity
animatorSet.start();
}
- private ObjectAnimator getAlphaAnimator(@NonNull Object target) {
+ private ObjectAnimator getAlphaAnimator(@NonNull View target) {
return ObjectAnimator.ofFloat(target, "alpha", 0f, 1f);
}
- private ObjectAnimator getAlphaRevAnimator(@NonNull Object target) {
+ private ObjectAnimator getAlphaRevAnimator(@NonNull View target) {
return ObjectAnimator.ofFloat(target, "alpha", 1f, 0f);
}
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/LoginBackdrop.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/LoginBackdrop.java
index 36936a68b62..5f164227d1f 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/LoginBackdrop.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/LoginBackdrop.java
@@ -396,6 +396,12 @@ public class LoginBackdrop extends Fragment implements BackPressListener {
getActivity().finish();
}
});
+ builder.setNeutralButton(R.string.hello_call_error_neutral, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ BroadcastManager.getInstance(getActivity()).addIntent(new Intent(AppConstants.INTENT_ACTION_SHOW_ONBOARDING));
+ }
+ });
builder.setCancelable(false);
builder.show();
}
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/ProtestTimeDialogFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/ProtestTimeDialogFragment.java
index 1d99b28da49..f88b66bbbc2 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/ProtestTimeDialogFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/dialogs/ProtestTimeDialogFragment.java
@@ -5,6 +5,28 @@ import java.util.Calendar;
import java.util.Date;
import java.util.List;
+import com.sap.sailing.android.shared.util.BitmapHelper;
+import com.sap.sailing.android.shared.util.BroadcastManager;
+import com.sap.sailing.android.shared.util.ScreenHelper;
+import com.sap.sailing.android.shared.util.ViewHelper;
+import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishedTimeFinder;
+import com.sap.sailing.domain.base.racegroup.RaceGroupSeriesFleet;
+import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
+import com.sap.sailing.racecommittee.app.AppConstants;
+import com.sap.sailing.racecommittee.app.AppPreferences;
+import com.sap.sailing.racecommittee.app.R;
+import com.sap.sailing.racecommittee.app.data.DataManager;
+import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager;
+import com.sap.sailing.racecommittee.app.domain.ManagedRace;
+import com.sap.sailing.racecommittee.app.utils.PreferenceHelper;
+import com.sap.sailing.racecommittee.app.utils.ThemeHelper;
+import com.sap.sailing.racecommittee.app.utils.TimeUtils;
+import com.sap.sse.common.Duration;
+import com.sap.sse.common.TimePoint;
+import com.sap.sse.common.TimeRange;
+import com.sap.sse.common.impl.MillisecondsTimePoint;
+import com.sap.sse.common.impl.TimeRangeImpl;
+
import android.annotation.TargetApi;
import android.content.Context;
import android.content.ContextWrapper;
@@ -27,27 +49,6 @@ import android.widget.ListView;
import android.widget.TextView;
import android.widget.TimePicker;
-import com.sap.sailing.android.shared.util.BitmapHelper;
-import com.sap.sailing.android.shared.util.BroadcastManager;
-import com.sap.sailing.android.shared.util.ScreenHelper;
-import com.sap.sailing.android.shared.util.ViewHelper;
-import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishedTimeFinder;
-import com.sap.sailing.domain.base.racegroup.RaceGroupSeriesFleet;
-import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
-import com.sap.sailing.racecommittee.app.AppConstants;
-import com.sap.sailing.racecommittee.app.AppPreferences;
-import com.sap.sailing.racecommittee.app.R;
-import com.sap.sailing.racecommittee.app.data.DataManager;
-import com.sap.sailing.racecommittee.app.data.ReadonlyDataManager;
-import com.sap.sailing.racecommittee.app.domain.ManagedRace;
-import com.sap.sailing.racecommittee.app.utils.ThemeHelper;
-import com.sap.sailing.racecommittee.app.utils.TimeUtils;
-import com.sap.sse.common.Duration;
-import com.sap.sse.common.TimePoint;
-import com.sap.sse.common.TimeRange;
-import com.sap.sse.common.impl.MillisecondsTimePoint;
-import com.sap.sse.common.impl.TimeRangeImpl;
-
public class ProtestTimeDialogFragment extends AttachedDialogFragment implements View.OnClickListener {
protected final static int MOVE_DOWN = -1;
@@ -66,6 +67,7 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
private View mHome;
private Button mChoose;
private AppPreferences mPreferences;
+ private Integer mDuration = null;
public ProtestTimeDialogFragment() {
races = new ArrayList<>();
@@ -100,7 +102,6 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- mPreferences = AppPreferences.on(getActivity());
View layout = super.onCreateView(inflater, container, savedInstanceState);
if (customView == null) {
layout = inflater.inflate(R.layout.protest_time_fragment, container, false);
@@ -210,7 +211,6 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
}
private View setupView() {
- mPreferences = AppPreferences.on(getActivity());
LayoutInflater inflater = LayoutInflater.from(getActivity());
View view = inflater.inflate(R.layout.protest_time_dialog, null);
mRacesList = (ListView) view.findViewById(R.id.protest_time_races_list);
@@ -296,11 +296,21 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
}
ReadonlyDataManager manager = DataManager.create(getActivity());
ArrayList raceIds = args.getStringArrayList(ARGS_RACE_IDS);
+ String raceGroup = null;
if (raceIds != null) {
for (String id : raceIds) {
- races.add(manager.getDataStore().getRace(id));
+ ManagedRace managedRace = manager.getDataStore().getRace(id);
+ if (raceGroup == null) {
+ raceGroup = managedRace.getRaceGroup().getName();
+ }
+ races.add(managedRace);
}
}
+ if (raceGroup != null) {
+ mPreferences = AppPreferences.on(getActivity(), PreferenceHelper.getRegattaPrefFileName(raceGroup));
+ } else {
+ mPreferences = AppPreferences.on(getActivity());
+ }
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
@@ -309,7 +319,7 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
TimePoint startTime = TimeUtils.getTime(mTimePicker);
TimePoint now = MillisecondsTimePoint.now();
for (ManagedRace race : selectedRaces) {
- Duration duration = Duration.ONE_MINUTE.times(AppPreferences.on(getActivity()).getProtestTimeDuration());
+ Duration duration = Duration.ONE_MINUTE.times(AppPreferences.on(getActivity()).getProtestTimeDurationInMinutes());
TimeRange protestTime = new TimeRangeImpl(startTime, startTime.plus(duration));
race.getState().setProtestTime(now, protestTime);
}
@@ -391,13 +401,21 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
}
private void updateProtestRange() {
- int duration = mPreferences.getProtestTimeDuration();
+ if (mDuration == null) {
+ mDuration = mPreferences.getProtestTimeDurationInMinutes();
+ if (mPreferences.isDefaultProtestTimeCustomEditable()) {
+ int custom = mPreferences.getProtestTimeDurationInMinutesCustom();
+ if (custom >= 0) {
+ mDuration = custom;
+ }
+ }
+ }
if (mProtestDuration != null) {
- mProtestDuration.setText(getString(R.string.protest_duration, duration));
+ mProtestDuration.setText(getString(R.string.protest_duration, mDuration));
}
if (mProtestEndTime != null) {
TimePoint startTime = TimeUtils.getTime(mTimePicker);
- TimePoint endTime = startTime.plus(Duration.ONE_MINUTE.times(duration));
+ TimePoint endTime = startTime.plus(Duration.ONE_MINUTE.times(mDuration));
mProtestEndTime.setText(getString(R.string.protest_end_time, TimeUtils.formatTime(endTime)));
}
}
@@ -440,7 +458,7 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
public void onClick(View v) {
FrameLayout layout = (FrameLayout) LayoutInflater.from(v.getContext()).inflate(R.layout.protest_duration, null);
final EditText duration = (EditText) layout.findViewById(R.id.protest_duration);
- duration.setText(String.valueOf(mPreferences.getProtestTimeDuration()));
+ duration.setText(String.valueOf(mDuration));
duration.setSelection(duration.length());
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextWrapper(v.getContext()), R.style.AppTheme_AlertDialog);
builder.setTitle(v.getContext().getString(R.string.protest_duration_dialog_title));
@@ -448,8 +466,10 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- int value = Integer.parseInt(duration.getText().toString());
- mPreferences.setProtestTimeDuration(value);
+ mDuration = Integer.parseInt(duration.getText().toString());
+ if (mPreferences.isDefaultProtestTimeCustomEditable()) {
+ mPreferences.setDefaultProtestTimeDurationInMinutesCustom(mDuration);
+ }
updateProtestRange();
}
});
@@ -457,4 +477,4 @@ public class ProtestTimeDialogFragment extends AttachedDialogFragment implements
builder.show();
}
}
-}
\ No newline at end of file
+}
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/CourseDesignerPreferenceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/CourseDesignerPreferenceFragment.java
index 26eb1d28f95..55203255515 100644
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/CourseDesignerPreferenceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/CourseDesignerPreferenceFragment.java
@@ -1,11 +1,11 @@
package com.sap.sailing.racecommittee.app.ui.fragments.preference;
-import android.os.Bundle;
-
import com.sap.sailing.android.shared.ui.fragments.preference.BasePreferenceFragment;
import com.sap.sailing.android.shared.ui.views.EditSetPreference;
import com.sap.sailing.racecommittee.app.R;
+import android.os.Bundle;
+
public class CourseDesignerPreferenceFragment extends BasePreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/RegattaPreferenceFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/RegattaPreferenceFragment.java
index 7f88a42549f..67a8d4cd015 100755
--- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/RegattaPreferenceFragment.java
+++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/preference/RegattaPreferenceFragment.java
@@ -5,12 +5,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Set;
-import android.os.Bundle;
-import android.preference.ListPreference;
-import android.preference.MultiSelectListPreference;
-import android.support.annotation.StringRes;
-import android.text.TextUtils;
-
import com.sap.sailing.android.shared.ui.fragments.preference.BasePreferenceFragment;
import com.sap.sailing.domain.base.configuration.RegattaConfiguration;
import com.sap.sailing.domain.common.CourseDesignerMode;
@@ -19,6 +13,12 @@ import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.ui.activities.PreferenceActivity;
+import android.os.Bundle;
+import android.preference.ListPreference;
+import android.preference.MultiSelectListPreference;
+import android.support.annotation.StringRes;
+import android.text.TextUtils;
+
/**
*
* This preference fragment can be redirected to display the {@link RegattaConfiguration} of a specific regatta.
@@ -38,15 +38,6 @@ public class RegattaPreferenceFragment extends BasePreferenceFragment {
}
addPreferencesFromResource(R.xml.preference_regatta_defaults);
- bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_rrs26_classflag_key));
- bindPreferenceSummaryToSet(findPreference(R.string.preference_racing_procedure_rrs26_startmode_flags_key));
- bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_swc_classflag_key));
- bindPreferenceSummaryToSet(findPreference(R.string.preference_racing_procedure_swc_startmode_flags_key));
- bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_gatestart_classflag_key));
- bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_ess_classflag_key));
- bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_basic_classflag_key));
- bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_league_classflag_key));
-
setupGeneral();
setupRRS26();
setupSWC();
@@ -56,32 +47,6 @@ public class RegattaPreferenceFragment extends BasePreferenceFragment {
setupLeague();
}
- private void setupRRS26() {
- setupStartmodeFlagsList(R.string.preference_racing_procedure_rrs26_startmode_flags_key);
- setupClassFlagList(this.findPreference(R.string.preference_racing_procedure_rrs26_classflag_key));
- }
-
- private void setupSWC() {
- setupStartmodeFlagsList(R.string.preference_racing_procedure_swc_startmode_flags_key);
- setupClassFlagList(this.findPreference(R.string.preference_racing_procedure_swc_classflag_key));
- }
-
- private void setupGateStart() {
- setupClassFlagList(this.findPreference(R.string.preference_racing_procedure_gatestart_classflag_key));
- }
-
- private void setupESS() {
- setupClassFlagList(this.findPreference(R.string.preference_racing_procedure_ess_classflag_key));
- }
-
- private void setupBasic() {
- setupClassFlagList(this.findPreference(R.string.preference_racing_procedure_basic_classflag_key));
- }
-
- private void setupLeague() {
- setupClassFlagList(this.findPreference(R.string.preference_racing_procedure_league_classflag_key));
- }
-
private void setupGeneral() {
setupRacingProcedureTypePreference();
setupCourseDesignerTypePreference();
@@ -89,6 +54,42 @@ public class RegattaPreferenceFragment extends BasePreferenceFragment {
setupProtestTimePreference();
}
+ private void setupRRS26() {
+ setupClassFlagList(this.findPreference(R.string.preference_racing_procedure_rrs26_classflag_key));
+ bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_rrs26_classflag_key));
+
+ setupStartmodeFlagsList(R.string.preference_racing_procedure_rrs26_startmode_flags_key);
+ bindPreferenceSummaryToSet(findPreference(R.string.preference_racing_procedure_rrs26_startmode_flags_key));
+ }
+
+ private void setupSWC() {
+ setupClassFlagList(this.findPreference(R.string.preference_racing_procedure_swc_classflag_key));
+ bindPreferenceSummaryToSet(findPreference(R.string.preference_racing_procedure_swc_startmode_flags_key));
+
+ setupStartmodeFlagsList(R.string.preference_racing_procedure_swc_startmode_flags_key);
+ bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_swc_classflag_key));
+ }
+
+ private void setupGateStart() {
+ setupClassFlagList(this.findPreference(R.string.preference_racing_procedure_gatestart_classflag_key));
+ bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_gatestart_classflag_key));
+ }
+
+ private void setupESS() {
+ setupClassFlagList(this.findPreference(R.string.preference_racing_procedure_ess_classflag_key));
+ bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_ess_classflag_key));
+ }
+
+ private void setupBasic() {
+ setupClassFlagList(this.findPreference(R.string.preference_racing_procedure_basic_classflag_key));
+ bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_basic_classflag_key));
+ }
+
+ private void setupLeague() {
+ setupClassFlagList(this.findPreference(R.string.preference_racing_procedure_league_classflag_key));
+ bindPreferenceSummaryToValue(findPreference(R.string.preference_racing_procedure_league_classflag_key));
+ }
+
private void setupRacingProcedureTypePreference() {
final ListPreference startProcedurePreference = findPreference(R.string.preference_racing_procedure_override_key);