diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceLogChangedVisitor.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceLogChangedVisitor.java index 969cc59e109..c9918bda54e 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceLogChangedVisitor.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceLogChangedVisitor.java @@ -9,31 +9,31 @@ import com.sap.sailing.domain.racelog.RaceLogStartTimeEvent; import com.sap.sailing.racecommittee.app.domain.state.RaceLogChangedListener; public class RaceLogChangedVisitor implements RaceLogEventVisitor { - - private RaceLogChangedListener listener; - public RaceLogChangedVisitor(RaceLogChangedListener listener) { - this.listener = listener; - } + private RaceLogChangedListener listener; - public void visit(RaceLogFlagEvent event) { - listener.eventAdded(event); - } + public RaceLogChangedVisitor(RaceLogChangedListener listener) { + this.listener = listener; + } - public void visit(RaceLogPassChangeEvent event) { - listener.eventAdded(event); - } + public void visit(RaceLogFlagEvent event) { + listener.eventAdded(event); + } - public void visit(RaceLogRaceStatusEvent event) { - listener.eventAdded(event); - } + public void visit(RaceLogPassChangeEvent event) { + listener.eventAdded(event); + } - public void visit(RaceLogStartTimeEvent event) { - listener.eventAdded(event); - } + public void visit(RaceLogRaceStatusEvent event) { + listener.eventAdded(event); + } - public void visit(RaceLogCourseAreaChangedEvent event) { - listener.eventAdded(event); - } + public void visit(RaceLogStartTimeEvent event) { + listener.eventAdded(event); + } + + public void visit(RaceLogCourseAreaChangedEvent event) { + listener.eventAdded(event); + } } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java index a5accffc594..eb8c54ee24d 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/domain/state/impl/RaceStateImpl.java @@ -79,7 +79,6 @@ public class RaceStateImpl implements RaceState, RaceLogChangedListener { } public void setStartTime(TimePoint eventTime, TimePoint newStartTime) { - RaceLogRaceStatus status = getStatus(); if (status != RaceLogRaceStatus.UNSCHEDULED) { abortRace(eventTime.minus(1)); diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/ManagedRaceListFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/ManagedRaceListFragment.java index 16a427df090..e2045dd761e 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/ManagedRaceListFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/lists/ManagedRaceListFragment.java @@ -35,305 +35,240 @@ import com.sap.sailing.racecommittee.app.ui.comparators.SeriesComparator; public class ManagedRaceListFragment extends ListFragment implements JuryFlagClickedListener, RaceStateChangedListener { - private Serializable selectedRaceId; - private HashMap managedRacesById; - private RaceListAdapter adapter; - private ArrayList raceDataTypeList; - - public ManagedRaceListFragment() { - this.selectedRaceId = null; - this.managedRacesById = new HashMap(); - this.raceDataTypeList = new ArrayList(); - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - // pass the localized string to the data elements... - RaceListDataTypeElement.initializeTemplates(this); + private Serializable selectedRaceId; + private HashMap managedRacesById; + private RaceListAdapter adapter; + private ArrayList raceDataTypeList; - adapter = new RaceListAdapter( - getActivity(), - R.layout.welter_two_row_no_image, - raceDataTypeList, - this); - getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); - setListAdapter(adapter); - adapter.getFilter().filter(""); - } - - @Override - public void onStart() { - super.onStart(); - unregisterAllRaces(); - registerAllRaces(); - } - - @Override - public void onStop() { - unregisterAllRaces(); - super.onStop(); - } + public ManagedRaceListFragment() { + this.selectedRaceId = null; + this.managedRacesById = new HashMap(); + this.raceDataTypeList = new ArrayList(); + } - private void registerAllRaces() { - for (ManagedRace managedRace : managedRacesById.values()) { - managedRace.getState().registerListener(this); - } - } + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + // pass the localized string to the data elements... + RaceListDataTypeElement.initializeTemplates(this); - private void unregisterAllRaces() { - for (ManagedRace managedRace : managedRacesById.values()) { - managedRace.getState().unregisterListener(this); - } - } + adapter = new RaceListAdapter(getActivity(), R.layout.welter_two_row_no_image, raceDataTypeList, this); + getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); + setListAdapter(adapter); + adapter.getFilter().filter(""); + } - public void setupOn(Collection listOfManagedRaces) { - unregisterAllRaces(); - managedRacesById.clear(); - for (ManagedRace managedRace : listOfManagedRaces) { - managedRacesById.put(managedRace.getId(), managedRace); - } - registerAllRaces(); + @Override + public void onStart() { + super.onStart(); + unregisterAllRaces(); + registerAllRaces(); + } - // initialize view - initListElements(false); - - if (adapter != null) { - adapter.getFilter().filter(""); - adapter.notifyDataSetChanged(); - } - } + @Override + public void onStop() { + unregisterAllRaces(); + super.onStop(); + } - public void onRaceStateChanged(RaceState state) { - notifyDataChanged(); - } - - private BoatClass getBoatClassForRace(ManagedRace managedRace) { - if (managedRace.getRaceGroup().getBoatClass() == null) { - return new BoatClassImpl(managedRace.getRaceGroup().getName(), false); - } - return managedRace.getRaceGroup().getBoatClass(); - } - - private void initListElements(boolean clearFirst) { - - HashMap savedStates = new HashMap(); - if (clearFirst) { - // we have to save the previous states of the elements - for (RaceListDataType r : raceDataTypeList) { - if (r instanceof RaceListDataTypeElement) { - RaceListDataTypeElement el = (RaceListDataTypeElement) r; - savedStates.put(el.getRace().getId(), el.getPreviousRaceStatus()); - } - } - raceDataTypeList.clear(); - } - - - TreeMap> raceListHashMap = - new TreeMap>(new SeriesComparator()); - if (managedRacesById != null) { - - // Group Managed Races by boat class and group - for (ManagedRace m : managedRacesById.values()) { - BoatClassSeriesDataFleet ser = new BoatClassSeriesDataFleet( - getBoatClassForRace(m), - m.getSeries(), - m.getFleet()); + private void registerAllRaces() { + for (ManagedRace managedRace : managedRacesById.values()) { + managedRace.getState().registerListener(this); + } + } - if (raceListHashMap.containsKey(ser)) { - raceListHashMap.get(ser).add(m); - } else { - List lmr = new LinkedList(); - lmr.add(m); - raceListHashMap.put(ser, lmr); - } + private void unregisterAllRaces() { + for (ManagedRace managedRace : managedRacesById.values()) { + managedRace.getState().unregisterListener(this); + } + } - } + public void setupOn(Collection listOfManagedRaces) { + unregisterAllRaces(); + managedRacesById.clear(); + for (ManagedRace managedRace : listOfManagedRaces) { + managedRacesById.put(managedRace.getId(), managedRace); + } + registerAllRaces(); - for (BoatClassSeriesDataFleet key : raceListHashMap.navigableKeySet()) { - List mrl = raceListHashMap.get(key); - Collections.sort(mrl, new NamedRaceComparator()); + // initialize view + initListElements(false); - raceDataTypeList.add(new RaceListDataTypeTitle(key)); + if (adapter != null) { + adapter.getFilter().filter(""); + adapter.notifyDataSetChanged(); + } + } - for (ManagedRace mr : mrl) { - RaceListDataTypeElement dataElement = new RaceListDataTypeElement(mr); - if (savedStates.containsKey(mr.getId())) { - dataElement.setPreviousRaceStatus(savedStates.get(mr.getId())); - } - raceDataTypeList.add(dataElement); - } - } - } - } - - @Override - public void onListItemClick(ListView listView, View view, int position, long id) { - super.onListItemClick(listView, view, position, id); - - RaceListDataType selectedItem = adapter.getItem(position); - if (selectedItem instanceof RaceListDataTypeElement) { - RaceListDataTypeElement selectedElement = (RaceListDataTypeElement) selectedItem; - selectedElement.setUpdateIndicator(false); - ((ImageView) view.findViewById(R.id.Welter_Cell_UpdateLabel)).setVisibility(View.GONE); - - ManagedRace selectedRace = selectedElement.getRace(); - this.selectedRaceId = selectedRace.getId(); - - ExLog.i( - ExLog.RACE_SELECTED_ELEMENT, - selectedRace.getId() + " " + selectedRace.getStatus(), - getActivity()); - - ((RacingActivity) getActivity()).onRaceItemClicked(selectedRace); - - } else if (selectedItem instanceof RaceListDataTypeTitle) { - RaceListDataTypeTitle selectedTitle = (RaceListDataTypeTitle) selectedItem; - ExLog.i( - ExLog.RACE_SELECTED_TITLE, - selectedTitle.toString(), - getActivity()); - } - } - - public void notifyDataChanged() { - List list = adapter.getItems(); - for (int i = 0; i < list.size(); ++i) { - if (list.get(i) instanceof RaceListDataTypeElement) { - RaceListDataTypeElement listElement = (RaceListDataTypeElement) list.get(i); - ManagedRace mr = this.managedRacesById.get(listElement.getRace().getId()); - if (mr != null) { - if (!listElement.getPreviousRaceStatus().name().equals(mr.getStatus().name())) { - listElement.setRace(mr); - - if (!listElement.getRace().getId().equals(this.selectedRaceId)) { - listElement.setUpdateIndicator(true); - } - /// TODO: StaticVibrator.vibrate(1000); - } - - } - } - } - if (adapter != null) { - adapter.getFilter().filter(""); - adapter.notifyDataSetChanged(); - } - } + public void onRaceStateChanged(RaceState state) { + notifyDataChanged(); + } - public void onJuryFlagClicked(BoatClassSeriesDataFleet clicked) { - /// TODO: implement. - } - - - /* - - public void notifyDataChanged() { - List list = adapter.getItems(); - for (int i = 0; i < list.size(); ++i) { - if (list.get(i) instanceof RaceListDataTypeElement) { - RaceListDataTypeElement listElement = (RaceListDataTypeElement) list.get(i); - ManagedRace mr = managedRacesMap.get(listElement.getRace().getId()); - if (mr != null) { - if (!listElement.getPreviousRaceStatus().name().equals(mr.getStatus().name())) { - listElement.setRace(mr); - - if (!listElement.getRace().getId().equals(selectedRaceId)) { - listElement.setUpdateIndicator(true); - } - StaticVibrator.vibrate(1000); - } - - } - } - } - if (adapter != null) { - adapter.getFilter().filter(""); - adapter.notifyDataSetChanged(); - } - } - + private BoatClass getBoatClassForRace(ManagedRace managedRace) { + if (managedRace.getRaceGroup().getBoatClass() == null) { + return new BoatClassImpl(managedRace.getRaceGroup().getName(), false); + } + return managedRace.getRaceGroup().getBoatClass(); + } - public void onJuryFlagClicked(final Group group) { - - TimePickerDialog dialog = createJuryDialog(group); - dialog.setIcon(R.drawable.ic_dialog_alert_holo_light); - dialog.setTitle(getString(R.string.protest_dialog_title)); - dialog.show(); - } + private void initListElements(boolean clearFirst) { - private TimePickerDialog createJuryDialog(final Group group) { - - // TODO: remove this hack!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - boolean hasFinishTime = false; - Date latestFinish = new Date(0); - for (Race race : group.getRaces()) { - FlagRacingEvent latestFinishEvent = new FlagRacingEvent(false, Flags.NONE, new Date(0), 0); - for (RacingEvent event : race.getEventLog()) { - if (event instanceof FlagRacingEvent) { - FlagRacingEvent flagEvent = (FlagRacingEvent) event; - if (flagEvent.getUpperFlag().equals(Flags.BLUE) && !flagEvent.isDisplayed()) { - if (latestFinishEvent.getTimeStamp().before(flagEvent.getTimeStamp())) { - latestFinishEvent = flagEvent; - } - } - } - } - if (latestFinish.before(latestFinishEvent.getTimeStamp())) { - latestFinish = latestFinishEvent.getTimeStamp(); - hasFinishTime = true; - } - } - - final Calendar presetJuryTime = Calendar.getInstance(); - - if (hasFinishTime) { - presetJuryTime.setTime(latestFinish); - } else { - Calendar now = Calendar.getInstance(); - now.set(Calendar.SECOND, 0); - now.set(Calendar.MILLISECOND, 0); - presetJuryTime.setTime(now.getTime()); - } - // we always add one minute to round the time - // so jury event is after finish event - presetJuryTime.add(Calendar.MINUTE, 1); - - TimePickerDialog dialog = new TimePickerDialog(getActivity(), new OnTimeSetListener() { - - public void onTimeSet(TimePicker view, int hourOfDay, int minute) { - Date protestStartDateTime = getStartOfProtestTime(hourOfDay, minute); - displayJuryFlag(group, new Date(), protestStartDateTime); - } - - }, presetJuryTime.get(Calendar.HOUR_OF_DAY), presetJuryTime.get(Calendar.MINUTE), true); - return dialog; - } - - private Date getStartOfProtestTime(int hourOfDay, int minute) { - Calendar now = Calendar.getInstance(); - now.set(Calendar.SECOND, 0); - now.set(Calendar.MILLISECOND, 0); - - Date pickedDate = (Date)now.getTime().clone(); - pickedDate.setHours(hourOfDay); - pickedDate.setMinutes(minute); + HashMap savedStates = new HashMap(); + if (clearFirst) { + // we have to save the previous states of the elements + for (RaceListDataType r : raceDataTypeList) { + if (r instanceof RaceListDataTypeElement) { + RaceListDataTypeElement el = (RaceListDataTypeElement) r; + savedStates.put(el.getRace().getId(), el.getPreviousRaceStatus()); + } + } + raceDataTypeList.clear(); + } - return pickedDate; - } + TreeMap> raceListHashMap = new TreeMap>( + new SeriesComparator()); + if (managedRacesById != null) { - private void displayJuryFlag(Group group, Date eventTime, Date protestTime) { - for (ManagedRace race : managedRacesMap.values()) { - if (!race.getGroup().equals(group)) { - continue; - } - if (race.getStatus().equals(SimpleRaceStatus.FINISHED)) { - race.displayJuryFlag(eventTime, protestTime); - } - } - Toast.makeText(getActivity(), String.format(getString(R.string.protest_flag_set), group.getName()), Toast.LENGTH_LONG).show(); - }*/ + // Group Managed Races by boat class and group + for (ManagedRace m : managedRacesById.values()) { + BoatClassSeriesDataFleet ser = new BoatClassSeriesDataFleet(getBoatClassForRace(m), m.getSeries(), + m.getFleet()); + + if (raceListHashMap.containsKey(ser)) { + raceListHashMap.get(ser).add(m); + } else { + List lmr = new LinkedList(); + lmr.add(m); + raceListHashMap.put(ser, lmr); + } + + } + + for (BoatClassSeriesDataFleet key : raceListHashMap.navigableKeySet()) { + List mrl = raceListHashMap.get(key); + Collections.sort(mrl, new NamedRaceComparator()); + + raceDataTypeList.add(new RaceListDataTypeTitle(key)); + + for (ManagedRace mr : mrl) { + RaceListDataTypeElement dataElement = new RaceListDataTypeElement(mr); + if (savedStates.containsKey(mr.getId())) { + dataElement.setPreviousRaceStatus(savedStates.get(mr.getId())); + } + raceDataTypeList.add(dataElement); + } + } + } + } + + @Override + public void onListItemClick(ListView listView, View view, int position, long id) { + super.onListItemClick(listView, view, position, id); + + RaceListDataType selectedItem = adapter.getItem(position); + if (selectedItem instanceof RaceListDataTypeElement) { + RaceListDataTypeElement selectedElement = (RaceListDataTypeElement) selectedItem; + selectedElement.setUpdateIndicator(false); + ((ImageView) view.findViewById(R.id.Welter_Cell_UpdateLabel)).setVisibility(View.GONE); + + ManagedRace selectedRace = selectedElement.getRace(); + this.selectedRaceId = selectedRace.getId(); + + ExLog.i(ExLog.RACE_SELECTED_ELEMENT, selectedRace.getId() + " " + selectedRace.getStatus(), getActivity()); + + ((RacingActivity) getActivity()).onRaceItemClicked(selectedRace); + + } else if (selectedItem instanceof RaceListDataTypeTitle) { + RaceListDataTypeTitle selectedTitle = (RaceListDataTypeTitle) selectedItem; + ExLog.i(ExLog.RACE_SELECTED_TITLE, selectedTitle.toString(), getActivity()); + } + } + + public void notifyDataChanged() { + List list = adapter.getItems(); + for (int i = 0; i < list.size(); ++i) { + if (list.get(i) instanceof RaceListDataTypeElement) { + RaceListDataTypeElement listElement = (RaceListDataTypeElement) list.get(i); + ManagedRace mr = this.managedRacesById.get(listElement.getRace().getId()); + if (mr != null) { + if (!listElement.getPreviousRaceStatus().name().equals(mr.getStatus().name())) { + listElement.setRace(mr); + + if (!listElement.getRace().getId().equals(this.selectedRaceId)) { + listElement.setUpdateIndicator(true); + } + // / TODO: StaticVibrator.vibrate(1000); + } + + } + } + } + if (adapter != null) { + adapter.getFilter().filter(""); + adapter.notifyDataSetChanged(); + } + } + + public void onJuryFlagClicked(BoatClassSeriesDataFleet clicked) { + // / TODO: implement. + } + + /* + * + * public void notifyDataChanged() { List list = adapter.getItems(); for (int i = 0; i < + * list.size(); ++i) { if (list.get(i) instanceof RaceListDataTypeElement) { RaceListDataTypeElement listElement = + * (RaceListDataTypeElement) list.get(i); ManagedRace mr = managedRacesMap.get(listElement.getRace().getId()); if + * (mr != null) { if (!listElement.getPreviousRaceStatus().name().equals(mr.getStatus().name())) { + * listElement.setRace(mr); + * + * if (!listElement.getRace().getId().equals(selectedRaceId)) { listElement.setUpdateIndicator(true); } + * StaticVibrator.vibrate(1000); } + * + * } } } if (adapter != null) { adapter.getFilter().filter(""); adapter.notifyDataSetChanged(); } } + * + * + * public void onJuryFlagClicked(final Group group) { + * + * TimePickerDialog dialog = createJuryDialog(group); dialog.setIcon(R.drawable.ic_dialog_alert_holo_light); + * dialog.setTitle(getString(R.string.protest_dialog_title)); dialog.show(); } + * + * private TimePickerDialog createJuryDialog(final Group group) { + * + * // TODO: remove this hack!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! boolean hasFinishTime = + * false; Date latestFinish = new Date(0); for (Race race : group.getRaces()) { FlagRacingEvent latestFinishEvent = + * new FlagRacingEvent(false, Flags.NONE, new Date(0), 0); for (RacingEvent event : race.getEventLog()) { if (event + * instanceof FlagRacingEvent) { FlagRacingEvent flagEvent = (FlagRacingEvent) event; if + * (flagEvent.getUpperFlag().equals(Flags.BLUE) && !flagEvent.isDisplayed()) { if + * (latestFinishEvent.getTimeStamp().before(flagEvent.getTimeStamp())) { latestFinishEvent = flagEvent; } } } } if + * (latestFinish.before(latestFinishEvent.getTimeStamp())) { latestFinish = latestFinishEvent.getTimeStamp(); + * hasFinishTime = true; } } + * + * final Calendar presetJuryTime = Calendar.getInstance(); + * + * if (hasFinishTime) { presetJuryTime.setTime(latestFinish); } else { Calendar now = Calendar.getInstance(); + * now.set(Calendar.SECOND, 0); now.set(Calendar.MILLISECOND, 0); presetJuryTime.setTime(now.getTime()); } // we + * always add one minute to round the time // so jury event is after finish event + * presetJuryTime.add(Calendar.MINUTE, 1); + * + * TimePickerDialog dialog = new TimePickerDialog(getActivity(), new OnTimeSetListener() { + * + * public void onTimeSet(TimePicker view, int hourOfDay, int minute) { Date protestStartDateTime = + * getStartOfProtestTime(hourOfDay, minute); displayJuryFlag(group, new Date(), protestStartDateTime); } + * + * }, presetJuryTime.get(Calendar.HOUR_OF_DAY), presetJuryTime.get(Calendar.MINUTE), true); return dialog; } + * + * private Date getStartOfProtestTime(int hourOfDay, int minute) { Calendar now = Calendar.getInstance(); + * now.set(Calendar.SECOND, 0); now.set(Calendar.MILLISECOND, 0); + * + * Date pickedDate = (Date)now.getTime().clone(); pickedDate.setHours(hourOfDay); pickedDate.setMinutes(minute); + * + * return pickedDate; } + * + * private void displayJuryFlag(Group group, Date eventTime, Date protestTime) { for (ManagedRace race : + * managedRacesMap.values()) { if (!race.getGroup().equals(group)) { continue; } if + * (race.getStatus().equals(SimpleRaceStatus.FINISHED)) { race.displayJuryFlag(eventTime, protestTime); } } + * Toast.makeText(getActivity(), String.format(getString(R.string.protest_flag_set), group.getName()), + * Toast.LENGTH_LONG).show(); } + */ } -