refs bug 1125

# added ui for triggering protest time
This commit is contained in:
Lukas Niemeier committed 2013-06-09 18:24:23 +02:00
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>
@@ -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());
}
}
}