Merge remote-tracking branch 'origin/bug3916'

This commit is contained in:
fmittag committed 2016-11-30 14:16:12 +01:00
commit 1f2acc1f90
84 files changed
+861 -716

No files matched your search

@@ -16,7 +16,7 @@
<string name="preference_energy_saving_sending_interval_summary">Choose a value as high as possible to preserve battery life while still maintaining a reasonable live experience, depending on your use case.</string>
<string name="preference_energy_saving_sending_interval_message">GPS updates will be sent to the server%1$s %2$s.</string>
<string name="preference_energy_saving_sending_interval_message_key">msgSndIntMessage</string>
<string name="preference_energy_saving_sending_interval_message_key" translatable="false">msgSndIntMessage</string>
<string name="preference_energy_saving_sending_interval_message_every">every</string>
<string-array name="preference_energy_saving_sending_interval_entries">
<item>immediately</item>
Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 625 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1020 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 941 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1020 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 941 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -199,7 +199,7 @@
<string name="gate_launch_stops_after">Gate Launch stoppt nach %dmin</string>
<string name="override_default_course_designer_type_select_header">Kursdesigner</string>
<string name="settings_course_designer_by_name_course_names_header">Kursnamen</string>
<string name="preference_racing_procedure_rrs26_startmode_flags_header">Startmodus Flaggen</string>
<string name="preference_racing_procedure_startmode_flags_header">Startmodus Flaggen</string>
<string name="preference_racing_procedure_classflag_header">Klassenflagge</string>
<string name="preference_racing_procedure_hasxray_header">Einzelrückruf</string>
<string name="preference_racing_procedure_hasxray_description">Diese Option aktiviert den Einzelrückruf</string>
@@ -61,6 +61,19 @@
<item>UNIFORM</item>
<item>ZULU</item>
</string-array>
<string name="preference_racing_procedure_swc_classflag_key" translatable="false">swcClassFlag</string>
<string name="preference_racing_procedure_swc_hasxray_key" translatable="false">swcIndividualRecall</string>
<bool name="preference_racing_procedure_swc_hasxray_default">true</bool>
<string name="preference_racing_procedure_swc_resultentryenabled_key" translatable="false">swcResultEntryEnabled</string>
<bool name="preference_racing_procedure_swc_resultentryenabled_default">false</bool>
<string name="preference_racing_procedure_swc_startmode_flags_key" translatable="false">swcStartmodeFlags</string>
<string-array name="preference_racing_procedure_swc_startmode_flags_default">
<item>PAPA</item>
<item>INDIA</item>
<item>BLACK</item>
<item>UNIFORM</item>
<item>ZULU</item>
</string-array>
<string name="preference_racing_procedure_gatestart_classflag_key" translatable="false">gateStartClassFlag</string>
<string name="preference_racing_procedure_gatestart_hasxray_key" translatable="false">gateStartIndividualRecall</string>
<bool name="preference_racing_procedure_gatestart_hasxray_default">false</bool>
@@ -207,7 +207,7 @@
<string name="settings_category_course_designer">Course Designer Configuration</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="preference_racing_procedure_rrs26_startmode_flags_header">Startmode Flags</string>
<string name="preference_racing_procedure_startmode_flags_header">Startmode Flags</string>
<string name="preference_racing_procedure_classflag_header">Class Flag</string>
<string name="preference_racing_procedure_hasxray_header">Individual Recall</string>
<string name="preference_racing_procedure_hasxray_description">Activate this option to enable individual recall</string>
@@ -72,7 +72,35 @@
android:defaultValue="@array/preference_racing_procedure_rrs26_startmode_flags_default"
android:key="@string/preference_racing_procedure_rrs26_startmode_flags_key"
android:summary="@string/empty"
android:title="@string/preference_racing_procedure_rrs26_startmode_flags_header" />
android:title="@string/preference_racing_procedure_startmode_flags_header" />
</PreferenceCategory>
<PreferenceCategory android:title="SWC Start">
<ListPreference
android:defaultValue="@string/preference_racing_procedure_classflag_default"
android:key="@string/preference_racing_procedure_swc_classflag_key"
android:summary="@string/empty"
android:title="@string/preference_racing_procedure_classflag_header" />
<CheckBoxPreference
android:defaultValue="@bool/preference_racing_procedure_swc_hasxray_default"
android:key="@string/preference_racing_procedure_swc_hasxray_key"
android:summary="@string/preference_racing_procedure_hasxray_description"
android:title="@string/preference_racing_procedure_hasxray_header" />
<CheckBoxPreference
android:defaultValue="@bool/preference_racing_procedure_swc_resultentryenabled_default"
android:key="@string/preference_racing_procedure_swc_resultentryenabled_key"
android:summary="@string/preference_racing_procedure_resultentryenabled_description"
android:title="@string/preference_racing_procedure_resultentryenabled_header"/>
<com.sap.sailing.racecommittee.app.ui.views.FixedMultiSelectListPreference
android:defaultValue="@array/preference_racing_procedure_swc_startmode_flags_default"
android:key="@string/preference_racing_procedure_swc_startmode_flags_key"
android:summary="@string/empty"
android:title="@string/preference_racing_procedure_startmode_flags_header" />
</PreferenceCategory>
@@ -223,6 +223,8 @@ public class AppPreferences {
switch (type) {
case RRS26:
return key(R.string.preference_racing_procedure_rrs26_classflag_key);
case SWC:
return key(R.string.preference_racing_procedure_swc_classflag_key);
case GateStart:
return key(R.string.preference_racing_procedure_gatestart_classflag_key);
case ESS:
@@ -245,6 +247,8 @@ public class AppPreferences {
switch (type) {
case RRS26:
return key(R.string.preference_racing_procedure_rrs26_hasxray_key);
case SWC:
return key(R.string.preference_racing_procedure_swc_hasxray_key);
case GateStart:
return key(R.string.preference_racing_procedure_gatestart_hasxray_key);
case ESS:
@@ -267,6 +271,8 @@ public class AppPreferences {
switch (type) {
case RRS26:
return key(R.string.preference_racing_procedure_rrs26_resultentryenabled_key);
case SWC:
return key(R.string.preference_racing_procedure_swc_resultentryenabled_key);
case GateStart:
return key(R.string.preference_racing_procedure_gatestart_resultentryenabled_key);
case ESS:
@@ -289,6 +295,15 @@ public class AppPreferences {
return flags;
}
public Set<Flags> getSWCStartmodeFlags() {
Set<String> flagNames = helper.getStringSet(key(R.string.preference_racing_procedure_swc_startmode_flags_key), new HashSet<String>());
Set<Flags> flags = new HashSet<>();
for (String flagName : flagNames) {
flags.add(Flags.valueOf(flagName));
}
return flags;
}
public String getServerBaseURL() {
return helper.getString(key(R.string.preference_server_url_key), null);
}
@@ -423,6 +438,14 @@ public class AppPreferences {
helper.getEditor().putStringSet(key(R.string.preference_racing_procedure_rrs26_startmode_flags_key), flagNames).commit();
}
public void setSWCStartmodeFlags(Set<Flags> flags) {
Set<String> flagNames = new HashSet<>();
for (Flags flag : flags) {
flagNames.add(flag.name());
}
helper.getEditor().putStringSet(key(R.string.preference_racing_procedure_swc_startmode_flags_key), flagNames).commit();
}
public void setSendingActive(boolean activate) {
ExLog.i(context, this.getClass().toString(), "setSendingActive: " + activate);
helper.getEditor().putBoolean(context.getResources().getString(R.string.preference_isSendingActive_key), activate).commit();
@@ -13,11 +13,12 @@ import com.sap.sailing.domain.base.configuration.impl.LeagueConfigurationImpl;
import com.sap.sailing.domain.base.configuration.impl.RRS26ConfigurationImpl;
import com.sap.sailing.domain.base.configuration.impl.RacingProcedureConfigurationImpl;
import com.sap.sailing.domain.base.configuration.impl.RegattaConfigurationImpl;
import com.sap.sailing.domain.base.configuration.impl.SWCConfigurationImpl;
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.LeagueConfiguration;
import com.sap.sailing.domain.base.configuration.procedures.RRS26Configuration;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.domain.base.configuration.procedures.SWCConfiguration;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.racecommittee.app.AppPreferences;
@@ -52,9 +53,16 @@ public class PreferencesRegattaConfigurationLoader implements ConfigurationLoade
rrs26.setClassFlag(preferences.getRacingProcedureClassFlag(RacingProcedureType.RRS26));
rrs26.setHasIndividualRecall(preferences.getRacingProcedureHasIndividualRecall(RacingProcedureType.RRS26));
rrs26.setResultEntryEnabled(preferences.getRacingProcedureIsResultEntryEnabled(RacingProcedureType.RRS26));
rrs26.setStartModeFlags(new ArrayList<Flags>(preferences.getRRS26StartmodeFlags()));
rrs26.setStartModeFlags(new ArrayList<>(preferences.getRRS26StartmodeFlags()));
configuration.setRRS26Configuration(rrs26);
SWCConfigurationImpl swcStart = new SWCConfigurationImpl();
swcStart.setClassFlag(preferences.getRacingProcedureClassFlag(RacingProcedureType.SWC));
swcStart.setHasIndividualRecall(preferences.getRacingProcedureHasIndividualRecall(RacingProcedureType.SWC));
swcStart.setResultEntryEnabled(preferences.getRacingProcedureIsResultEntryEnabled(RacingProcedureType.SWC));
swcStart.setStartModeFlags(new ArrayList<>(preferences.getSWCStartmodeFlags()));
configuration.setSWCConfiguration(swcStart);
GateStartConfigurationImpl gateStart = new GateStartConfigurationImpl();
gateStart.setClassFlag(preferences.getRacingProcedureClassFlag(RacingProcedureType.GateStart));
gateStart.setHasIndividualRecall(preferences.getRacingProcedureHasIndividualRecall(RacingProcedureType.GateStart));
@@ -100,9 +108,17 @@ public class PreferencesRegattaConfigurationLoader implements ConfigurationLoade
RRS26Configuration config = configuration.getRRS26Configuration();
storeRacingProcedureConfiguration(RacingProcedureType.RRS26, config);
if (config.getStartModeFlags() != null) {
preferences.setRRS26StartmodeFlags(new HashSet<Flags>(config.getStartModeFlags()));
preferences.setRRS26StartmodeFlags(new HashSet<>(config.getStartModeFlags()));
}
}
if (configuration.getSWCConfiguration() != null) {
SWCConfiguration config = configuration.getSWCConfiguration();
storeRacingProcedureConfiguration(RacingProcedureType.SWC, config);
if (config.getStartModeFlags() != null) {
preferences.setSWCStartmodeFlags(new HashSet<>(config.getStartModeFlags()));
}
}
if (configuration.getGateStartConfiguration() != null) {
GateStartConfiguration config = configuration.getGateStartConfiguration();
storeRacingProcedureConfiguration(RacingProcedureType.GateStart, config);
@@ -18,10 +18,7 @@ import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.ViewHelper;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.CourseFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.LineStartModeFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.PhotoListFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.StartProcedureFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.TrackingListFragment;
public class FinishedButtonFragment extends BasePanelFragment {
@@ -110,17 +107,17 @@ public class FinishedButtonFragment extends BasePanelFragment {
private void uncheckMarker(View view) {
if (isAdded() && view != null) {
if (!view.equals(mRecord)) {
resetFragment(null, getFrameId(getActivity(), R.id.race_edit, R.id.race_content, false), StartProcedureFragment.class);
// TODO
setMarkerLevel(mRecord, R.id.record_marker, LEVEL_NORMAL);
}
if (!view.equals(mPhoto)) {
resetFragment(null, getFrameId(getActivity(), R.id.race_edit, R.id.race_content, false), LineStartModeFragment.class);
resetFragment(null, getFrameId(getActivity(), R.id.race_edit, R.id.race_content, false), PhotoListFragment.class);
setMarkerLevel(mPhoto, R.id.photo_marker, LEVEL_NORMAL);
}
if (!view.equals(mList)) {
resetFragment(null, getFrameId(getActivity(), R.id.race_edit, R.id.race_content, false), CourseFragment.class);
resetFragment(null, getFrameId(getActivity(), R.id.race_edit, R.id.race_content, false), TrackingListFragment.class);
setMarkerLevel(mList, R.id.list_marker, LEVEL_NORMAL);
}
}
@@ -1,436 +0,0 @@
package com.sap.sailing.racecommittee.app.ui.fragments.panels;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.util.AppUtils;
import com.sap.sailing.android.shared.util.ViewHelper;
import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState;
import com.sap.sailing.domain.abstractlog.race.state.impl.BaseRaceStateChangedListener;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRacingProcedure;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartRacingProcedure;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.BaseRacingProcedureChangedListener;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26RacingProcedure;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.GateStartPathFinderFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.GateStartTimingFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.LineStartModeFragment;
import com.sap.sailing.racecommittee.app.ui.utils.FlagsResources;
import com.sap.sailing.racecommittee.app.utils.RaceHelper;
public class MorePanelFragment extends BasePanelFragment {
private RaceStateChangedListener mStateListener;
private RaceProcedureChangedListener mProcedureListener;
private IntentReceiver mReceiver;
// Start Mode Toggle
private View mStartMode;
private View mStartModeLock;
private ImageView mStartModeFlag;
private View mStartModeLayer;
// Gate Start PathFinder
private View mGatePathfinder;
private View mGatePathfinderLock;
private TextView mGatePathfinderValue;
private View mGatePathfinderLayer;
// Gate Start Timing
private View mGateTiming;
private View mGateTimingLock;
private TextView mGateTimingValue;
private View mGateTimingLayer;
public MorePanelFragment() {
mReceiver = new IntentReceiver();
}
public static MorePanelFragment newInstance(Bundle args) {
MorePanelFragment fragment = new MorePanelFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.race_panel_more, container, false);
mStateListener = new RaceStateChangedListener();
mProcedureListener = new RaceProcedureChangedListener();
mStartMode = ViewHelper.get(layout, R.id.start_mode);
if (mStartMode != null) {
mStartMode.setOnClickListener(new StartModeClick());
}
mStartModeLock = ViewHelper.get(layout, R.id.start_mode_lock);
mStartModeFlag = ViewHelper.get(layout, R.id.start_mode_flag);
mStartModeLayer = ViewHelper.get(layout, R.id.start_mode_layer);
mGatePathfinder = ViewHelper.get(layout, R.id.gate_pathfinder);
if (mGatePathfinder != null) {
mGatePathfinder.setOnClickListener(new PathfinderClick());
}
mGatePathfinderLock = ViewHelper.get(layout, R.id.gate_pathfinder_lock);
mGatePathfinderValue = ViewHelper.get(layout, R.id.gate_pathfinder_value);
mGatePathfinderLayer = ViewHelper.get(layout, R.id.gate_pathfinder_layer);
mGateTiming = ViewHelper.get(layout, R.id.gate_timing);
if (mGateTiming != null) {
mGateTiming.setOnClickListener(new TimingClick());
}
mGateTimingLock = ViewHelper.get(layout, R.id.gate_timing_lock);
mGateTimingValue = ViewHelper.get(layout, R.id.gate_timing_value);
mGateTimingLayer = ViewHelper.get(layout, R.id.gate_timing_layer);
View view = ViewHelper.get(layout, R.id.top_line);
if (view != null && AppUtils.with(getActivity()).isPort()) {
view.setVisibility(View.GONE);
}
return layout;
}
@Override
public void onResume() {
super.onResume();
refreshPanel();
checkStatus();
getRaceState().addChangedListener(mStateListener);
getRaceState().getRacingProcedure().addChangedListener(mProcedureListener);
IntentFilter filter = new IntentFilter();
filter.addAction(AppConstants.INTENT_ACTION_TOGGLE);
filter.addAction(AppConstants.INTENT_ACTION_CLEAR_TOGGLE);
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver, filter);
}
@Override
public void onPause() {
super.onPause();
getRaceState().removeChangedListener(mStateListener);
getRaceState().getRacingProcedure().removeChangedListener(mProcedureListener);
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mReceiver);
}
private void refreshPanel() {
RacingProcedure procedure = getRaceState().getRacingProcedure();
if (procedure instanceof RRS26RacingProcedure) {
RRS26RacingProcedure typedProcedure = getRaceState().getTypedRacingProcedure();
if (mStartMode != null && mStartModeFlag != null) {
mStartMode.setVisibility(View.VISIBLE);
mStartModeFlag.setImageDrawable(FlagsResources
.getFlagDrawable(getActivity(), typedProcedure.getStartModeFlag().name(), getResources().getInteger(R.integer.flag_size)));
}
}
if (procedure instanceof GateStartRacingProcedure) {
GateStartRacingProcedure typedProcedure = getRaceState().getTypedRacingProcedure();
if (mGatePathfinder != null && mGatePathfinderValue != null) {
mGatePathfinder.setVisibility(View.VISIBLE);
mGatePathfinderValue.setText(typedProcedure.getPathfinder());
}
if (mGateTiming != null && mGateTimingValue != null) {
mGateTiming.setVisibility(View.VISIBLE);
mGateTimingValue.setText(RaceHelper.getGateTiming(getActivity(), typedProcedure, getRace().getRaceGroup()));
}
}
}
private void checkStatus() {
switch (getRace().getStatus()) {
case UNSCHEDULED:
changeVisibility(mStartModeLock, mStartModeLayer, View.GONE);
changeVisibility(mGatePathfinderLock, mGatePathfinderLayer, View.GONE);
changeVisibility(mGateTimingLock, mGateTimingLayer, View.GONE);
break;
case PRESCHEDULED:
changeVisibility(mStartModeLock, mStartModeLayer, View.GONE);
changeVisibility(mGatePathfinderLock, mGatePathfinderLayer, View.GONE);
changeVisibility(mGateTimingLock, mGateTimingLayer, View.GONE);
break;
case SCHEDULED:
changeVisibility(mStartModeLock, mStartModeLayer, View.GONE);
changeVisibility(mGatePathfinderLock, mGatePathfinderLayer, View.GONE);
changeVisibility(mGateTimingLock, mGateTimingLayer, View.GONE);
break;
case STARTPHASE:
changeVisibility(mStartModeLock, mStartModeLayer, View.VISIBLE);
changeVisibility(mGatePathfinderLock, mGatePathfinderLayer, View.VISIBLE);
changeVisibility(mGateTimingLock, mGateTimingLayer, View.VISIBLE);
break;
case RUNNING:
changeVisibility(mStartModeLock, mStartModeLayer, View.VISIBLE);
changeVisibility(mGatePathfinderLock, mGatePathfinderLayer, View.VISIBLE);
changeVisibility(mGateTimingLock, mGateTimingLayer, View.VISIBLE);
uncheckMarker(mStartMode);
break;
case FINISHING:
changeVisibility(mStartModeLock, mStartModeLayer, View.VISIBLE);
changeVisibility(mGatePathfinderLock, mGatePathfinderLayer, View.VISIBLE);
changeVisibility(mGateTimingLock, mGateTimingLayer, View.VISIBLE);
uncheckMarker(mStartMode);
break;
case FINISHED:
changeVisibility(mStartModeLock, mStartModeLayer, View.GONE);
changeVisibility(mGatePathfinderLock, mGatePathfinderLayer, View.GONE);
changeVisibility(mGateTimingLock, mGateTimingLayer, View.GONE);
uncheckMarker(mStartMode);
break;
default:
changeVisibility(mStartModeLock, mStartModeLayer, View.VISIBLE);
changeVisibility(mGatePathfinderLock, mGatePathfinderLayer, View.VISIBLE);
changeVisibility(mGateTimingLock, mGateTimingLayer, View.VISIBLE);
uncheckMarker(mStartMode);
break;
}
}
private void uncheckMarker(View view) {
if (isAdded() && view != null) {
if (!AppUtils.with(getActivity()).is10inch()) {
if (!view.equals(mStartMode)) {
setMarkerLevel(mStartMode, R.id.start_mode_marker, LEVEL_NORMAL);
}
if (!view.equals(mGatePathfinder)) {
setMarkerLevel(mGatePathfinder, R.id.gate_pathfinder_marker, LEVEL_NORMAL);
}
if (!view.equals(mGateTiming)) {
setMarkerLevel(mGateTiming, R.id.gate_timing_marker, LEVEL_NORMAL);
}
}
}
}
private class RaceStateChangedListener extends BaseRaceStateChangedListener {
private View mView;
public RaceStateChangedListener() {
mView = new View(getActivity());
}
@Override
public void onRacingProcedureChanged(ReadonlyRaceState state) {
super.onRacingProcedureChanged(state);
refreshPanel();
uncheckMarker(mView);
}
@Override
public void onCourseDesignChanged(ReadonlyRaceState state) {
super.onCourseDesignChanged(state);
refreshPanel();
uncheckMarker(mView);
}
@Override
public void onWindFixChanged(ReadonlyRaceState state) {
super.onWindFixChanged(state);
refreshPanel();
uncheckMarker(mView);
}
@Override
public void onStatusChanged(ReadonlyRaceState state) {
super.onStatusChanged(state);
checkStatus();
uncheckMarker(mView);
}
}
private class RaceProcedureChangedListener extends BaseRacingProcedureChangedListener {
private View mView;
public RaceProcedureChangedListener() {
mView = new View(getActivity());
}
@Override
public void onActiveFlagsChanged(ReadonlyRacingProcedure racingProcedure) {
super.onActiveFlagsChanged(racingProcedure);
refreshPanel();
uncheckMarker(mView);
}
}
private class StartModeClick implements View.OnClickListener, DialogInterface.OnClickListener {
private final String TAG = StartModeClick.class.getName();
private final View container = mStartMode;
private final int markerId = R.id.start_mode_marker;
public void onClick(View v) {
if (mStartModeLock != null) {
if (mStartModeLock.getVisibility() == View.VISIBLE && isNormal(container, markerId)) {
showChangeDialog(this);
} else {
toggleFragment();
}
}
}
@Override
public void onClick(DialogInterface dialog, int which) {
toggleFragment();
}
private void toggleFragment() {
sendIntent(AppConstants.INTENT_ACTION_TOGGLE, AppConstants.INTENT_ACTION_EXTRA, AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE_MORE_MODE);
switch (toggleMarker(container, markerId)) {
case LEVEL_NORMAL:
sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT);
break;
case LEVEL_TOGGLED:
replaceFragment(LineStartModeFragment.newInstance(LineStartModeFragment.START_MODE_PLANNED));
break;
default:
ExLog.i(getActivity(), TAG, "Unknown return value");
}
disableToggle(container, markerId);
}
}
private class PathfinderClick implements View.OnClickListener, DialogInterface.OnClickListener {
private final String TAG = PathfinderClick.class.getName();
private final View container = mGatePathfinder;
private final int markerId = R.id.gate_pathfinder_marker;
@Override
public void onClick(View v) {
if (mGatePathfinderLock != null) {
if (mGatePathfinderLock.getVisibility() == View.VISIBLE && isNormal(container, markerId)) {
showChangeDialog(this);
} else {
toggleFragment();
}
}
}
@Override
public void onClick(DialogInterface dialog, int which) {
toggleFragment();
}
private void toggleFragment() {
sendIntent(AppConstants.INTENT_ACTION_TOGGLE, AppConstants.INTENT_ACTION_EXTRA, AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE_MORE_PATHFINDER);
switch (toggleMarker(container, markerId)) {
case LEVEL_NORMAL:
sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT);
break;
case LEVEL_TOGGLED:
replaceFragment(GateStartPathFinderFragment.newInstance(GateStartPathFinderFragment.START_MODE_PLANNED));
break;
default:
ExLog.i(getActivity(), TAG, "Unknown return value");
}
disableToggle(container, markerId);
}
}
private class TimingClick implements View.OnClickListener, DialogInterface.OnClickListener {
private final String TAG = TimingClick.class.getName();
private final View container = mGateTiming;
private final int markerId = R.id.gate_timing_marker;
@Override
public void onClick(View v) {
if (mGateTimingLock != null) {
if (mGateTimingLock.getVisibility() == View.VISIBLE && isNormal(container, markerId)) {
showChangeDialog(this);
} else {
toggleFragment();
}
}
}
@Override
public void onClick(DialogInterface dialog, int which) {
toggleFragment();
}
private void toggleFragment() {
sendIntent(AppConstants.INTENT_ACTION_TOGGLE, AppConstants.INTENT_ACTION_EXTRA, AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE_MORE_TIMING);
switch (toggleMarker(container, markerId)) {
case LEVEL_NORMAL:
sendIntent(AppConstants.INTENT_ACTION_SHOW_MAIN_CONTENT);
break;
case LEVEL_TOGGLED:
replaceFragment(GateStartTimingFragment.newInstance(GateStartTimingFragment.START_MODE_PLANNED));
break;
default:
ExLog.i(getActivity(), TAG, "Unknown return value");
}
disableToggle(container, markerId);
}
}
private class IntentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (AppConstants.INTENT_ACTION_CLEAR_TOGGLE.equals(action)) {
uncheckMarker(new View(context));
}
if (AppConstants.INTENT_ACTION_TOGGLE.equals(action)) {
if (intent.getExtras() != null) {
String data = intent.getExtras().getString(AppConstants.INTENT_ACTION_EXTRA);
if (AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE_MORE_MODE.equals(data)) {
uncheckMarker(mStartMode);
} else if (AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE_MORE_PATHFINDER.equals(data)) {
uncheckMarker(mGatePathfinder);
} else if (AppConstants.INTENT_ACTION_TOGGLE_PROCEDURE_MORE_TIMING.equals(data)) {
uncheckMarker(mGateTiming);
} else {
uncheckMarker(new View(context));
}
}
}
}
}
}
@@ -21,7 +21,7 @@ import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ReadonlyRac
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.ESSRacingProcedure;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartRacingProcedure;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.BaseRacingProcedureChangedListener;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26RacingProcedure;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.ConfigurableStartModeFlagRacingProcedure;
import com.sap.sailing.domain.common.Wind;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.R;
@@ -29,8 +29,8 @@ import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.BaseFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.CourseFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.GateStartPathFinderFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.GateStartTimingFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.LineStartModeFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.RaceFactorFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.StartModeFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.StartProcedureFragment;
import com.sap.sailing.racecommittee.app.ui.fragments.raceinfo.WindFragment;
import com.sap.sailing.racecommittee.app.ui.utils.FlagsResources;
@@ -176,9 +176,9 @@ public class SetupPanelFragment extends BasePanelFragment {
mButtonRaceGroup.setVisibility(View.GONE);
}
if (getRaceState().getRacingProcedure() instanceof RRS26RacingProcedure) {
if (getRaceState().getRacingProcedure() instanceof ConfigurableStartModeFlagRacingProcedure) {
if (mButtonMode != null) {
RRS26RacingProcedure typedProcedure = getRaceState().getTypedRacingProcedure();
ConfigurableStartModeFlagRacingProcedure typedProcedure = getRaceState().getTypedRacingProcedure();
mButtonMode.setPanelImage(FlagsResources.getFlagDrawable(getActivity(), typedProcedure.getStartModeFlag().name(), getResources().getInteger(R.integer.flag_size)));
mButtonMode.setVisibility(View.VISIBLE);
}
@@ -344,7 +344,7 @@ public class SetupPanelFragment extends BasePanelFragment {
mButtonProcedure.setMarkerLevel(PanelButton.LEVEL_NORMAL);
}
if (mButtonMode != null && !mButtonMode.equals(view)) {
resetFragment(mButtonMode.isLocked(), getFrameId(getActivity(), R.id.race_edit, R.id.race_content, false), LineStartModeFragment.class);
resetFragment(mButtonMode.isLocked(), getFrameId(getActivity(), R.id.race_edit, R.id.race_content, false), StartModeFragment.class);
mButtonMode.setMarkerLevel(PanelButton.LEVEL_NORMAL);
}
if (mButtonPathfinder != null && !mButtonPathfinder.equals(view)) {
@@ -466,7 +466,7 @@ public class SetupPanelFragment extends BasePanelFragment {
break;
case PanelButton.LEVEL_TOGGLED:
replaceFragment(LineStartModeFragment.newInstance(LineStartModeFragment.START_MODE_PLANNED));
replaceFragment(StartModeFragment.newInstance(StartModeFragment.START_MODE_PLANNED));
break;
default:
@@ -8,6 +8,7 @@ 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;
@@ -39,6 +40,8 @@ public class RegattaPreferenceFragment extends BasePreferenceFragment {
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));
@@ -46,6 +49,7 @@ public class RegattaPreferenceFragment extends BasePreferenceFragment {
setupGeneral();
setupRRS26();
setupSWC();
setupGateStart();
setupESS();
setupBasic();
@@ -53,10 +57,15 @@ public class RegattaPreferenceFragment extends BasePreferenceFragment {
}
private void setupRRS26() {
setupRRS26StartmodeFlagsList();
setupStartmodeFlagsList(R.string.preference_racing_procedure_rrs26_startmode_flags_key);
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_rrs26_classflag_key));
}
private void setupSWC() {
setupStartmodeFlagsList(R.string.preference_racing_procedure_swc_startmode_flags_key);
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_swc_classflag_key));
}
private void setupGateStart() {
setupClassFlagList(this.<ListPreference>findPreference(R.string.preference_racing_procedure_gatestart_classflag_key));
}
@@ -122,8 +131,8 @@ public class RegattaPreferenceFragment extends BasePreferenceFragment {
bindPreferenceSummaryToInteger(findPreference(R.string.preference_protest_time_duration_key));
}
private void setupRRS26StartmodeFlagsList() {
MultiSelectListPreference preference = findPreference(R.string.preference_racing_procedure_rrs26_startmode_flags_key);
private void setupStartmodeFlagsList(@StringRes int prefId) {
MultiSelectListPreference preference = findPreference(prefId);
List<String> flags = new ArrayList<>();
for (Flags flag : Flags.validValues()) {
flags.add(flag.name());
@@ -19,12 +19,12 @@ import com.sap.sailing.domain.abstractlog.race.SimpleRaceLogIdentifier;
import com.sap.sailing.domain.abstractlog.race.scoring.AdditionalScoringInformationType;
import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState;
import com.sap.sailing.domain.abstractlog.race.state.impl.BaseRaceStateChangedListener;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedure;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.ess.ESSRacingProcedure;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.gate.GateStartRacingProcedure;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26RacingProcedure;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.ConfigurableStartModeFlagRacingProcedure;
import com.sap.sailing.domain.common.Wind;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.domain.common.racelog.RacingProcedureType;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.data.DataManager;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
@@ -59,7 +59,7 @@ public class MainScheduleFragment extends BaseFragment implements View.OnClickLi
private SimpleRaceLogIdentifier mRaceId;
private TimePoint mStartTime;
private Duration mStartTimeDiff;
private RacingProcedureType mRacingProcedureType;
private RacingProcedure mRacingProcedure;
private TimePoint lastTick;
private Calendar mCalendar;
@@ -146,29 +146,27 @@ public class MainScheduleFragment extends BaseFragment implements View.OnClickLi
}
private void initStartMode() {
mRacingProcedureType = getRaceState().getRacingProcedure().getType();
if (mRacingProcedureType != null) {
mRacingProcedure = getRaceState().getRacingProcedure();
if (mRacingProcedure != null) {
Runnable runnableProcedure = new Runnable() {
@Override
public void run() {
openFragment(StartProcedureFragment.newInstance(START_MODE_PRESETUP));
}
};
mItems.add(new SelectionItem(getString(R.string.start_procedure), mRacingProcedureType.toString(), null, false, false, runnableProcedure));
if (RacingProcedureType.RRS26.equals(mRacingProcedureType)) {
// LineStart
RRS26RacingProcedure procedure = getRaceState().getTypedRacingProcedure();
mItems.add(new SelectionItem(getString(R.string.start_procedure), mRacingProcedure.getType().toString(), null, false, false, runnableProcedure));
if (mRacingProcedure instanceof ConfigurableStartModeFlagRacingProcedure) {
final ConfigurableStartModeFlagRacingProcedure procedure = getRaceState().getTypedRacingProcedure();
Flags flag = procedure.getStartModeFlag();
Runnable runnableMode = new Runnable() {
@Override
public void run() {
openFragment(LineStartModeFragment.newInstance(START_MODE_PRESETUP));
openFragment(StartModeFragment.newInstance(START_MODE_PRESETUP));
}
};
Drawable drawable = FlagsResources.getFlagDrawable(getActivity(), flag.name(), mFlagSize);
mItems.add(new SelectionItem(getString(R.string.start_mode), flag.name(), drawable, false, false, runnableMode));
} else if (RacingProcedureType.GateStart.equals(mRacingProcedureType)) {
// GateStart
} else if (mRacingProcedure instanceof GateStartRacingProcedure) {
GateStartRacingProcedure procedure = getRaceState().getTypedRacingProcedure();
if (procedure != null) {
Runnable runnablePathfinder = new Runnable() {
@@ -187,8 +185,7 @@ public class MainScheduleFragment extends BaseFragment implements View.OnClickLi
};
mItems.add(new SelectionItem(getString(R.string.gate_start_timing), RaceHelper.getGateTiming(getActivity(), procedure, getRace().getRaceGroup()), null, false, false, runnableTiming));
}
} else if (RacingProcedureType.ESS.equals(mRacingProcedureType)) {
// Extreme Sailing Series
} else if (mRacingProcedure instanceof ESSRacingProcedure) {
ESSRacingProcedure procedure = getRaceState().getTypedRacingProcedure();
if (procedure != null) {
boolean checked = getArguments().getBoolean(RACE_GROUP, getRaceState().isAdditionalScoringInformationEnabled(AdditionalScoringInformationType.MAX_POINTS_DECREASE_MAX_SCORE));
@@ -253,16 +250,16 @@ public class MainScheduleFragment extends BaseFragment implements View.OnClickLi
}
private void startRace() {
RRS26RacingProcedure rrs26Procedure = null;
ConfigurableStartModeFlagRacingProcedure lineStartRacingProcedure = null;
Flags flag = null;
if (RacingProcedureType.RRS26.equals(getRaceState().getRacingProcedure().getType())) {
rrs26Procedure = getRaceState().getTypedRacingProcedure();
flag = rrs26Procedure.getStartModeFlag();
if (getRaceState().getRacingProcedure() instanceof ConfigurableStartModeFlagRacingProcedure) {
lineStartRacingProcedure = getRaceState().getTypedRacingProcedure();
flag = lineStartRacingProcedure.getStartModeFlag();
}
TimePoint now = MillisecondsTimePoint.now();
getRaceState().setRacingProcedure(now, mRacingProcedureType);
if (RacingProcedureType.ESS.equals(mRacingProcedureType) && mItemRaceGroup != null) {
getRaceState().setRacingProcedure(now, mRacingProcedure.getType());
if (mRacingProcedure instanceof ESSRacingProcedure && mItemRaceGroup != null) {
getRaceState().setAdditionalScoringInformationEnabled(MillisecondsTimePoint.now(), /*enable*/ mItemRaceGroup.isChecked(),
AdditionalScoringInformationType.MAX_POINTS_DECREASE_MAX_SCORE);
}
@@ -271,8 +268,8 @@ public class MainScheduleFragment extends BaseFragment implements View.OnClickLi
} else {
getRaceState().forceNewDependentStartTime(now, mStartTimeDiff, mRaceId);
}
if (rrs26Procedure != null) {
rrs26Procedure.setStartModeFlag(MillisecondsTimePoint.now(), flag);
if (lineStartRacingProcedure != null) {
lineStartRacingProcedure.setStartModeFlag(MillisecondsTimePoint.now(), flag);
}
}
@@ -14,7 +14,7 @@ import android.widget.AdapterView;
import android.widget.ListView;
import com.sap.sailing.android.shared.util.AppUtils;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.rrs26.RRS26RacingProcedure;
import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.line.ConfigurableStartModeFlagRacingProcedure;
import com.sap.sailing.domain.common.racelog.Flags;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.R;
@@ -24,14 +24,14 @@ import com.sap.sailing.racecommittee.app.ui.layouts.HeaderLayout;
import com.sap.sailing.racecommittee.app.ui.utils.FlagsResources;
import com.sap.sse.common.impl.MillisecondsTimePoint;
public class LineStartModeFragment extends BaseFragment {
public class StartModeFragment extends BaseFragment {
private ListView mListView;
private RRS26RacingProcedure mProcedure;
private ConfigurableStartModeFlagRacingProcedure mLineStartProcedure;
private int mFlagSize;
public static LineStartModeFragment newInstance(@START_MODE_VALUES int startMode) {
LineStartModeFragment fragment = new LineStartModeFragment();
public static StartModeFragment newInstance(@START_MODE_VALUES int startMode) {
StartModeFragment fragment = new StartModeFragment();
Bundle args = new Bundle();
args.putInt(START_MODE, startMode);
fragment.setArguments(args);
@@ -58,7 +58,7 @@ public class LineStartModeFragment extends BaseFragment {
}
}
mProcedure = getRaceState().getTypedRacingProcedure();
mLineStartProcedure = getRaceState().getTypedRacingProcedure();
}
@Override
@@ -87,36 +87,39 @@ public class LineStartModeFragment extends BaseFragment {
super.onResume();
ArrayList<StartModeItem> startModes = new ArrayList<>();
List<Flags> flags = mProcedure.getConfiguration().getStartModeFlags();
int position = 0;
int selected = -1;
for (Flags flag : flags) {
StartModeItem startMode = new StartModeItem(flag);
startMode.setImage(FlagsResources.getFlagDrawable(getActivity(), startMode.getFlagName(), mFlagSize));
startModes.add(startMode);
}
Collections.sort(startModes, new StartModeComparator());
for (StartModeItem startModeItem : startModes) {
if (startModeItem.getFlag().equals(mProcedure.getStartModeFlag())) {
selected = position;
List<Flags> flags = mLineStartProcedure.getConfiguration().getStartModeFlags();
if (flags != null) {
int position = 0;
int selected = -1;
for (Flags flag : flags) {
StartModeItem startMode = new StartModeItem(flag);
startMode.setImage(FlagsResources.getFlagDrawable(getActivity(), startMode.getFlagName(), mFlagSize));
startModes.add(startMode);
}
position++;
}
final CheckedItemAdapter adapter = new CheckedItemAdapter(getActivity(), startModes);
adapter.setCheckedPosition(selected);
mListView.setAdapter(adapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
adapter.setCheckedPosition(position);
StartModeItem item = (StartModeItem) adapter.getItem(position);
if (item != null) {
onClick(item);
Collections.sort(startModes, new StartModeComparator());
for (StartModeItem startModeItem : startModes) {
Flags flag = mLineStartProcedure.getStartModeFlag();
if (startModeItem.getFlag().equals(flag)) {
selected = position;
}
position++;
}
});
final CheckedItemAdapter adapter = new CheckedItemAdapter(getActivity(), startModes);
adapter.setCheckedPosition(selected);
mListView.setAdapter(adapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
adapter.setCheckedPosition(position);
StartModeItem item = (StartModeItem) adapter.getItem(position);
if (item != null) {
onClick(item);
}
}
});
sendIntent(AppConstants.INTENT_ACTION_TIME_HIDE);
sendIntent(AppConstants.INTENT_ACTION_TIME_HIDE);
}
}
@Override
@@ -128,10 +131,11 @@ public class LineStartModeFragment extends BaseFragment {
public void onClick(StartModeItem startMode) {
boolean sameFlag = false;
if (startMode.getFlag() == mProcedure.getStartModeFlag()) {
Flags flag = mLineStartProcedure.getStartModeFlag();
mLineStartProcedure.setStartModeFlag(MillisecondsTimePoint.now(), startMode.getFlag());
if (startMode.getFlag().equals(flag)) {
sameFlag = true;
}
mProcedure.setStartModeFlag(MillisecondsTimePoint.now(), startMode.getFlag());
if (getArguments() != null && getArguments().getInt(START_MODE, START_MODE_PRESETUP) == START_MODE_PRESETUP) {
openMainScheduleFragment();
} else {
@@ -105,6 +105,11 @@ public class FlagsResources {
outline = outline.replace("XX", "01");
break;
case OSCAR:
flag = "flag_oscar_" + size + "dp";
outline = outline.replace("XX", "01");
break;
case PAPA:
flag = "flag_papa_" + size + "dp";
outline = outline.replace("XX", "01");