mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-08 21:30:57 +00:00
refs bug 1125
# added ui for triggering protest time
This commit is contained in:
1 parent
89b8f1913f
commit
24a41bb3de
2 files changed
+284
No files matched your search
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:dslv="http://schemas.android.com/apk**/res-auto"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal"
|
||||
android:padding="18dp" >
|
||||
|
||||
<ListView
|
||||
android:id="@+id/protest_time_races_list"
|
||||
android:layout_width="300dp"
|
||||
android:layout_height="match_parent"
|
||||
android:verticalSpacing="5dp" />
|
||||
|
||||
<TimePicker
|
||||
android:id="@+id/protest_time_time_time_picker"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:orientation="horizontal"
|
||||
android:paddingLeft="18dp"
|
||||
android:paddingRight="18dp"
|
||||
android:paddingBottom="18dp" >
|
||||
|
||||
<Button
|
||||
android:id="@+id/protest_time_canel_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:text="Cancel" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/protest_time_ok_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:text="Set protest time" />
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
+229
@@ -0,0 +1,229 @@
|
||||
package com.sap.sailing.racecommittee.app.ui.fragments.dialogs;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.DialogFragment;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.util.SparseBooleanArray;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.ListView;
|
||||
import android.widget.TimePicker;
|
||||
|
||||
import com.sap.sailing.domain.base.impl.MillisecondsTimePoint;
|
||||
import com.sap.sailing.domain.common.TimePoint;
|
||||
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
|
||||
import com.sap.sailing.domain.racelog.analyzing.impl.FinishedTimeFinder;
|
||||
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;
|
||||
|
||||
public class ProtestTimeDialogFragment extends DialogFragment {
|
||||
|
||||
public interface ProtestTimeSetListener {
|
||||
public void onProtestTimeSet(List<ManagedRace> races);
|
||||
}
|
||||
|
||||
private static String ARGS_RACE_IDS = ProtestTimeDialogFragment.class.getSimpleName() + ".raceids";
|
||||
|
||||
public static ProtestTimeDialogFragment newInstace(List<ManagedRace> races) {
|
||||
ArrayList<Serializable> raceIds = new ArrayList<Serializable>();
|
||||
for (ManagedRace race : races) {
|
||||
raceIds.add(race.getId());
|
||||
}
|
||||
Bundle args = new Bundle();
|
||||
args.putSerializable(ARGS_RACE_IDS, raceIds);
|
||||
|
||||
ProtestTimeDialogFragment fragment = new ProtestTimeDialogFragment();
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
private ProtestTimeSetListener listener;
|
||||
private List<ManagedRace> races;
|
||||
private ListView racesList;
|
||||
private TimePicker timePicker;
|
||||
|
||||
public ProtestTimeDialogFragment() {
|
||||
races = new ArrayList<ManagedRace>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(Activity activity) {
|
||||
super.onAttach(activity);
|
||||
|
||||
if (activity instanceof ProtestTimeSetListener) {
|
||||
this.listener = (ProtestTimeSetListener) activity;
|
||||
} else {
|
||||
throw new IllegalStateException(String.format(
|
||||
"Instance of %s must be attached to instances of %s. Tried to attach to %s.",
|
||||
ProtestTimeDialogFragment.class.getName(), ProtestTimeSetListener.class.getName(), activity.getClass()
|
||||
.getName()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
return inflater.inflate(R.layout.protest_time_view, container, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
|
||||
if (getDialog() != null) {
|
||||
getDialog().setTitle("Protest time");
|
||||
}
|
||||
|
||||
getRacesFromArguments();
|
||||
|
||||
Button okButton = (Button) getView().findViewById(R.id.protest_time_ok_button);
|
||||
okButton.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
setAndAnnounceProtestTime();
|
||||
dismiss();
|
||||
}
|
||||
});
|
||||
|
||||
racesList = (ListView) getView().findViewById(R.id.protest_time_races_list);
|
||||
setupRacesList(racesList);
|
||||
|
||||
timePicker = (TimePicker) getView().findViewById(R.id.protest_time_time_time_picker);
|
||||
setupTimePicker(timePicker);
|
||||
}
|
||||
|
||||
private void setupRacesList(ListView racesList) {
|
||||
racesList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
|
||||
racesList.setAdapter(new ProtestTimeAdapter(getActivity(), races));
|
||||
{
|
||||
int i = 0;
|
||||
for (ManagedRace race : races) {
|
||||
racesList.setItemChecked(i++, isFinishedToday(race));
|
||||
}
|
||||
}
|
||||
{
|
||||
SparseBooleanArray checked = racesList.getCheckedItemPositions();
|
||||
for (int i = 0; i < racesList.getCount(); i++) {
|
||||
if (checked.get(i)) {
|
||||
racesList.setSelection(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void setupTimePicker(TimePicker timePicker) {
|
||||
timePicker.setIs24HourView(true);
|
||||
Calendar now = Calendar.getInstance();
|
||||
now.add(Calendar.MINUTE, 10);
|
||||
int hours = now.get(Calendar.HOUR_OF_DAY);
|
||||
int minutes = now.get(Calendar.MINUTE);
|
||||
minutes = (int) (Math.ceil((minutes / 5.0)) * 5.0);
|
||||
if (minutes >= 60) {
|
||||
hours++;
|
||||
}
|
||||
|
||||
timePicker.setCurrentHour(hours);
|
||||
timePicker.setCurrentMinute(minutes);
|
||||
}
|
||||
|
||||
private void getRacesFromArguments() {
|
||||
Bundle args = getArguments();
|
||||
if (args == null) {
|
||||
throw new IllegalStateException("Arguments needed!");
|
||||
}
|
||||
|
||||
ReadonlyDataManager manager = DataManager.create(getActivity());
|
||||
@SuppressWarnings("unchecked")
|
||||
ArrayList<Serializable> raceIds = (ArrayList<Serializable>) args.getSerializable(ARGS_RACE_IDS);
|
||||
for (Serializable id : raceIds) {
|
||||
races.add(manager.getDataStore().getRace(id));
|
||||
}
|
||||
}
|
||||
|
||||
private void setAndAnnounceProtestTime() {
|
||||
List<ManagedRace> selectedRaces = getSelectedRaces();
|
||||
TimePoint protestTime = getProtestTime();
|
||||
for (ManagedRace race : selectedRaces) {
|
||||
race.getState().setProtestTime(protestTime);
|
||||
}
|
||||
listener.onProtestTimeSet(selectedRaces);
|
||||
}
|
||||
|
||||
private List<ManagedRace> getSelectedRaces() {
|
||||
List<ManagedRace> result = new ArrayList<ManagedRace>();
|
||||
SparseBooleanArray checked = racesList.getCheckedItemPositions();
|
||||
for (int i = 0; i < racesList.getCount(); i++) {
|
||||
if (checked.get(i)) {
|
||||
result.add(races.get(i));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private TimePoint getProtestTime() {
|
||||
Calendar time = Calendar.getInstance();
|
||||
time.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());
|
||||
time.set(Calendar.MINUTE, timePicker.getCurrentMinute());
|
||||
return new MillisecondsTimePoint(time.getTime());
|
||||
}
|
||||
|
||||
private static boolean isFinishedToday(ManagedRace race) {
|
||||
if (race.getStatus().equals(RaceLogRaceStatus.FINISHED)) {
|
||||
FinishedTimeFinder analyzer = new FinishedTimeFinder(race.getRaceLog());
|
||||
TimePoint finishedTime = analyzer.getFinishedTime();
|
||||
if (finishedTime != null) {
|
||||
Calendar finishedCalendar = Calendar.getInstance();
|
||||
finishedCalendar.setTime(finishedTime.asDate());
|
||||
Calendar now = Calendar.getInstance();
|
||||
return finishedCalendar.get(Calendar.YEAR) == now.get(Calendar.YEAR)
|
||||
&& finishedCalendar.get(Calendar.DAY_OF_YEAR) == now.get(Calendar.DAY_OF_YEAR);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static class ProtestTimeAdapter extends ArrayAdapter<ManagedRaceItem> {
|
||||
|
||||
private static List<ManagedRaceItem> wrap(List<ManagedRace> races) {
|
||||
List<ManagedRaceItem> wrapped = new ArrayList<ManagedRaceItem>();
|
||||
for (ManagedRace race : races) {
|
||||
wrapped.add(new ManagedRaceItem(race));
|
||||
}
|
||||
return wrapped;
|
||||
}
|
||||
|
||||
public ProtestTimeAdapter(Context context, List<ManagedRace> objects) {
|
||||
super(context, android.R.layout.simple_list_item_multiple_choice, wrap(objects));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class ManagedRaceItem {
|
||||
|
||||
private ManagedRace race;
|
||||
|
||||
public ManagedRaceItem(ManagedRace race) {
|
||||
this.race = race;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("%s %s %s %s", race.getRaceGroup().getBoatClass().getName(), race.getSeries()
|
||||
.getName(), race.getFleet().getName(), race.getRaceName());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user