Merge branch 'ubilabs--rcapp--bug-2979' into ubilabs--rcapp--develop

This commit is contained in:
Peter Siegmund committed 2015-06-23 10:38:28 +02:00
commit ffe0b5469a
24 files changed
+734 -309

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 758 B

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- pressed -->
<item android:drawable="@drawable/ic_create_yellow_36dp" android:state_pressed="true" />
<!-- default -->
<item android:drawable="@drawable/ic_create_white_36dp" />
</selector>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- pressed -->
<item android:drawable="@drawable/ic_create_yellow_36dp" android:state_pressed="true" />
<!-- default -->
<item android:drawable="@drawable/ic_create_black_36dp" />
</selector>
@@ -89,59 +89,12 @@
android:id="@+id/line_top"
android:layout_width="match_parent"
android:layout_height="@dimen/thick_line"
android:layout_below="@+id/buttonBar"
android:layout_below="@id/buttonBar"
android:background="?black"/>
<RelativeLayout
<include
layout="@layout/race_time_picker"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/buttonBar"
android:background="?sap_gray_black_30">
<LinearLayout
android:id="@+id/start_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:scaleX="1.55"
android:scaleY="1.55">
<NumberPicker
android:id="@+id/start_date_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:descendantFocusability="blocksDescendants"/>
<include
android:id="@+id/start_time_picker"
layout="@layout/time_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"/>
</LinearLayout>
<Button
android:id="@+id/set_start_time"
style="?attr/buttonSolidSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerInParent="true"
android:layout_margin="@dimen/default_margin_twice"
android:maxWidth="200dp"
android:text="@string/race_set_start"/>
<TextView
android:id="@+id/debug_time"
style="?textSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:visibility="gone"
tools:text="12:12:12"/>
</RelativeLayout>
android:layout_below="@id/buttonBar"/>
</RelativeLayout>
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
@@ -30,7 +30,7 @@
android:layout_centerVertical="true"
android:text="@string/race_summary_title"
android:textColor="?white"
android:textSize="@dimen/textSize_40" />
android:textSize="@dimen/textSize_40"/>
</RelativeLayout>
@@ -38,7 +38,7 @@
android:layout_width="match_parent"
android:layout_height="@dimen/thin_line"
android:layout_marginBottom="@dimen/default_margin_half"
android:background="?sap_gray" />
android:background="?sap_gray"/>
<LinearLayout
android:layout_width="match_parent"
@@ -52,14 +52,14 @@
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="@string/race_summary_start"
android:textAppearance="?attr/textNormal" />
android:textAppearance="?attr/textNormal"/>
<ImageView
android:id="@+id/edit_race_start_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="?create_36dp"
android:visibility="gone"
android:src="?create"
android:visibility="invisible"
tools:visibility="visible"/>
<TextView
@@ -69,12 +69,12 @@
android:layout_weight="1"
android:gravity="right"
android:textAppearance="?attr/textNormal"
tools:text="11:00:00" />
tools:text="11:00:00"/>
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
android:layout_weight="1"/>
</LinearLayout>
<LinearLayout
@@ -88,15 +88,14 @@
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="@string/race_summary_finish_begin"
android:textAppearance="?attr/textNormal" />
android:textAppearance="?attr/textNormal"/>
<ImageView
android:id="@+id/edit_race_finish_begin_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="?create_36dp"
android:visibility="gone"
tools:visibility="visible"/>
android:src="?create"
android:visibility="visible"/>
<TextView
android:id="@+id/race_finish_begin_time"
@@ -105,7 +104,7 @@
android:layout_weight="1"
android:gravity="right"
android:textAppearance="?attr/textNormal"
tools:text="11:12:18" />
tools:text="11:12:18"/>
<TextView
android:id="@+id/race_finish_begin_duration"
@@ -114,7 +113,7 @@
android:layout_weight="1"
android:gravity="right"
android:textAppearance="?textNormal"
tools:text="12:18 min" />
tools:text="12:18 min"/>
</LinearLayout>
<LinearLayout
@@ -128,15 +127,14 @@
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="@string/race_summary_finish_end"
android:textAppearance="?attr/textNormal" />
android:textAppearance="?attr/textNormal"/>
<ImageView
android:id="@+id/edit_race_finish_end_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="?create_36dp"
android:visibility="gone"
tools:visibility="visible"/>
android:src="?create"
android:visibility="visible"/>
<TextView
android:id="@+id/race_finish_end_time"
@@ -145,7 +143,7 @@
android:layout_weight="1"
android:gravity="right"
android:textAppearance="?attr/textNormal"
tools:text="11:16:36" />
tools:text="11:16:36"/>
<TextView
android:id="@+id/race_finish_end_duration"
@@ -154,7 +152,7 @@
android:layout_weight="1"
android:gravity="right"
android:textAppearance="?attr/textNormal"
tools:text="16:36 min" />
tools:text="16:36 min"/>
</LinearLayout>
<LinearLayout
@@ -168,7 +166,7 @@
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="@string/race_summary_finish_duration"
android:textAppearance="?attr/textNormal" />
android:textAppearance="?attr/textNormal"/>
<TextView
android:id="@+id/race_finish_duration"
@@ -177,7 +175,7 @@
android:layout_weight="2"
android:gravity="right"
android:textAppearance="?attr/textNormal"
tools:text="04:18 min" />
tools:text="04:18 min"/>
</LinearLayout>
<LinearLayout
@@ -191,7 +189,7 @@
android:layout_height="@dimen/thin_line"
android:layout_marginBottom="@dimen/default_margin_half"
android:layout_marginTop="@dimen/default_margin_half"
android:background="?sap_gray" />
android:background="?sap_gray"/>
<LinearLayout
android:layout_width="match_parent"
@@ -204,7 +202,7 @@
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="@string/race_summary_wind_direction"
android:textAppearance="?attr/textNormal" />
android:textAppearance="?attr/textNormal"/>
<TextView
android:id="@+id/wind_direction"
@@ -213,7 +211,7 @@
android:layout_weight="2"
android:gravity="right"
android:textAppearance="?attr/textNormal"
tools:text="from 192°" />
tools:text="from 192°"/>
</LinearLayout>
<LinearLayout
@@ -227,17 +225,17 @@
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="@string/race_summary_wind_speed"
android:textAppearance="?attr/textNormal" />
android:textAppearance="?attr/textNormal"/>
<TextView
android:id="@+id/wind_speed"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="2"
android:gravity="right"
android:textAppearance="?attr/textNormal"
tools:text="6.5 kts"
android:layout_gravity="center_vertical"/>
tools:text="6.5 kts"/>
</LinearLayout>
</LinearLayout>
@@ -252,7 +250,7 @@
android:layout_height="@dimen/thin_line"
android:layout_marginBottom="@dimen/default_margin_half"
android:layout_marginTop="@dimen/default_margin_half"
android:background="?sap_gray" />
android:background="?sap_gray"/>
<LinearLayout
android:layout_width="match_parent"
@@ -264,14 +262,14 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/race_summary_individual_recalls"
android:textAppearance="?attr/textNormal" />
android:textAppearance="?attr/textNormal"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:textAppearance="?attr/textNormal"
tools:text="AUT 553 GER 766 ITA 912" />
tools:text="AUT 553 GER 766 ITA 912"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="@dimen/selector_header_height"
android:background="?sap_gray">
<LinearLayout
android:id="@+id/header_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="@dimen/default_margin"
android:layout_marginStart="@dimen/default_margin"
android:orientation="horizontal">
<ImageView
android:id="@+id/header_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="?chevron_left_24dp"/>
<TextView
android:id="@+id/header_headline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/set_time"
android:textAppearance="?textNormal"/>
</LinearLayout>
</RelativeLayout>
<include
layout="@layout/race_time_picker"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/header"/>
</RelativeLayout>
@@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?sap_gray_black_30">
<LinearLayout
android:id="@+id/picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:scaleX="1.55"
android:scaleY="1.55">
<NumberPicker
android:id="@+id/date_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:descendantFocusability="blocksDescendants"/>
<include
android:id="@+id/time_picker"
layout="@layout/time_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"/>
<NumberPicker
android:id="@+id/second_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:descendantFocusability="blocksDescendants"
android:visibility="gone"
tools:visibility="visible"/>
</LinearLayout>
<Button
android:id="@+id/set_date_time"
style="?attr/buttonSolidXSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/picker"
android:layout_margin="@dimen/default_margin_twice"
android:maxWidth="200dp"
android:layout_centerHorizontal="true"
android:text="@string/race_set_time"/>
<TextView
android:id="@+id/debug_time"
style="?textSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:visibility="gone"
tools:text="12:12:12"/>
</RelativeLayout>
@@ -323,7 +323,7 @@
<string name="race_reset_confirm">Rennen zurücksetzen</string>
<string name="race_reset_cancel">Nein danke</string>
<string name="race_reset_message">Möchten Sie wirklich das Rennen inklusive aller Einstellungen und getätigten Aktionen zurücksetzen? Das kann nicht rückgängig gemacht werden!</string>
<string name="race_set_start">Startzeit setzen</string>
<string name="race_set_time">Zeit setzen</string>
<string name="race_start_time_in">-#TIME#</string>
<string name="race_start_time_ago">#TIME#</string>
<string name="tomorrow">Morgen</string>
@@ -421,6 +421,12 @@
<string name="change_message">Nach den Wettfahrtregeln sind diese Daten im aktuellen Rennenstatus nicht veränderbar.\nSie könnten jedoch die falschen Eingaben korrigieren.</string>
<string name="change_title">Warnung</string>
<string name="send_mail">Sende Email...</string>
<string name="data_reload_title">Daten wurden extern verändert</string>
<string name="data_reload_message">Daten müssen neu geladen werden. Eventueller Datenverlust ist möglich.</string>
<string name="error_finished_time">Die ausgewählte Zielzeit liegt vor der Zeit, der ersten Schiffeinfahrt. Bitte überprüfe die Uhrzeit.</string>
<string name="error_finishing_time">Die ausgewählte Zeit is vor dem Rennstart. Bitte überprüfe die Uhrzeit.</string>
<string name="error_time_in_future">Die ausgewählte Zeit liegt in der Zukunft. Bitte überprüfe die Uhrzeit.</string>
<string name="error_wrong_race_state">Der RaceState hat nicht den korrekten Status (benötigt: %1$s - aktuell: %2$s)</string>
</resources>
@@ -16,6 +16,7 @@
<attr name="white_invert" format="color"/>
<!-- custom references (e.g. styles) -->
<attr name="buttonSolidXSmall" format="reference"/>
<attr name="buttonSolidSmall" format="reference"/>
<attr name="buttonSolidNormal" format="reference"/>
<attr name="textXXSmall" format="reference"/>
@@ -43,7 +44,7 @@
<attr name="chevron_left_24dp" format="reference"/>
<attr name="chevron_left_36dp" format="reference"/>
<attr name="chevron_right_36dp" format="reference"/>
<attr name="create_36dp" format="reference"/>
<attr name="create" format="reference"/>
<attr name="compass_back" format="reference"/>
<attr name="compass_needle" format="reference"/>
<attr name="course_triangle_48dp" format="reference"/>
@@ -249,7 +249,7 @@
<string name="race_start_in_1_minute">1 Minute</string>
<string name="race_start_time_in">-#TIME#</string>
<string name="race_start_time_ago">#TIME#</string>
<string name="race_set_start">Set Start Time</string>
<string name="race_set_time">Set Time</string>
<string name="race_reset_course">Reset course</string>
<string name="no_course_active">No course active</string>
<string name="toggle_group_race_mode">Group Race?</string>
@@ -444,5 +444,9 @@
<string name="send_mail">Send mail...</string>
<string name="data_reload_title">Data has changed externally</string>
<string name="data_reload_message">Data have to be reloaded. Possible data loss is possible.</string>
<string name="error_finished_time">The given finish time is earlier than the first finisher time. Please recheck the time.</string>
<string name="error_finishing_time">The selected time is before the race start.</string>
<string name="error_time_in_future">The given time is in future. Please recheck the time.</string>
<string name="error_wrong_race_state">The RaceState isn\'t in the correct state (needed: %1$s - current: %2$s)</string>
</resources>
@@ -31,6 +31,7 @@
<item name="white_invert">@color/constant_black</item>
<!-- styles -->
<item name="buttonSolidXSmall">@style/AppTheme.Dark.Button.XSmall</item>
<item name="buttonSolidSmall">@style/AppTheme.Dark.Button.Small</item>
<item name="buttonSolidNormal">@style/AppTheme.Dark.Button.Normal</item>
<item name="textXXSmall">@style/AppTheme.Dark.Text.XXSmall</item>
@@ -57,7 +58,7 @@
<item name="chevron_left_24dp">@drawable/ic_chevron_left_white_24dp</item>
<item name="chevron_left_36dp">@drawable/ic_chevron_left_white_36dp</item>
<item name="chevron_right_36dp">@drawable/ic_chevron_right_white_36dp</item>
<item name="create_36dp">@drawable/ic_create_white_36dp</item>
<item name="create">@drawable/ic_create_dark</item>
<item name="compass_back">@drawable/compass_back_dark</item>
<item name="compass_needle">@drawable/compass_needle_dark</item>
<item name="course_triangle_48dp">@drawable/course_triangle_48dp_dark</item>
@@ -115,6 +116,10 @@
<item name="android:textColorHint">?sap_light_gray</item>
</style>
<style name="AppTheme.Dark.Button.XSmall">
<item name="android:textSize">@dimen/textSize_18</item>
</style>
<style name="AppTheme.Dark.Button.Small">
<item name="android:textSize">@dimen/textSize_22</item>
</style>
@@ -34,6 +34,7 @@
<item name="white_invert">@color/constant_white</item>
<!-- styles -->
<item name="buttonSolidXSmall">@style/AppTheme.Light.Button.XSmall</item>
<item name="buttonSolidSmall">@style/AppTheme.Light.Button.Small</item>
<item name="buttonSolidNormal">@style/AppTheme.Light.Button.Normal</item>
<item name="textXXSmall">@style/AppTheme.Light.Text.XXSmall</item>
@@ -60,7 +61,7 @@
<item name="chevron_left_24dp">@drawable/ic_chevron_left_black_24dp</item>
<item name="chevron_left_36dp">@drawable/ic_chevron_left_black_36dp</item>
<item name="chevron_right_36dp">@drawable/ic_chevron_right_black_36dp</item>
<item name="create_36dp">@drawable/ic_create_black_36dp</item>
<item name="create">@drawable/ic_create_light</item>
<item name="compass_back">@drawable/compass_back_light</item>
<item name="compass_needle">@drawable/compass_needle_light</item>
<item name="course_triangle_48dp">@drawable/course_triangle_48dp_light</item>
@@ -118,6 +119,10 @@
<item name="android:textColorHint">?sap_light_gray</item>
</style>
<style name="AppTheme.Light.Button.XSmall">
<item name="android:textSize">@dimen/textSize_18</item>
</style>
<style name="AppTheme.Light.Button.Small">
<item name="android:textSize">@dimen/textSize_22</item>
</style>
@@ -1,16 +1,18 @@
package com.sap.sailing.racecommittee.app.domain;
import java.util.Collection;
import java.util.List;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.state.RaceState;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.racecommittee.app.domain.impl.Result;
import com.sap.sse.common.Named;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.WithID;
import java.util.Collection;
import java.util.List;
public interface ManagedRace extends ManagedRaceIdentifier, Named, WithID {
/**
@@ -80,4 +82,20 @@ public interface ManagedRace extends ManagedRaceIdentifier, Named, WithID {
* the retrieved list of mapItems for this race
*/
void setMapMarkers(List<MapMarker> markers);
/**
* sets the finished time, if the finished time is after the finishing time; check the {@link Result} for error message
*
* @param finishedTime finished time
* @return result object
*/
Result setFinishedTime(TimePoint finishedTime);
/**
* sets the finishing time, if the finishing time is after the start time; check the {@link Result} for error message
*
* @param finishingTime finishing time
* @return result object
*/
Result setFinishingTime(TimePoint finishingTime);
}
@@ -1,122 +1,163 @@
package com.sap.sailing.racecommittee.app.domain.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.state.RaceState;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.SeriesBase;
import com.sap.sailing.domain.base.racegroup.RaceGroup;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier;
import com.sap.sailing.racecommittee.app.domain.MapMarker;
public class ManagedRaceImpl implements ManagedRace {
private static final long serialVersionUID = -4936566684992524001L;
// private static final String TAG = ManagedRace.class.getName();
private final RaceState state;
private final ManagedRaceIdentifier identifier;
private Collection<Competitor> competitors;
private List<MapMarker> mapMarkers;
private CourseBase courseOnServer;
public ManagedRaceImpl(ManagedRaceIdentifier identifier, RaceState state) {
this.state = state;
this.identifier = identifier;
this.competitors = new ArrayList<Competitor>();
this.courseOnServer = null;
}
@Override
public RaceState getState() {
return state;
}
@Override
public String getId() {
return identifier.getId();
}
@Override
public String getName() {
return identifier.getRaceName();
}
@Override
public String getRaceName() {
return getName();
}
@Override
public Fleet getFleet() {
return identifier.getFleet();
}
@Override
public SeriesBase getSeries() {
return identifier.getSeries();
}
@Override
public RaceGroup getRaceGroup() {
return identifier.getRaceGroup();
}
@Override
public ManagedRaceIdentifier getIdentifier() {
return identifier;
}
@Override
public RaceLog getRaceLog() {
return state.getRaceLog();
}
@Override
public RaceLogRaceStatus getStatus() {
return state.getStatus();
}
@Override
public CourseBase getCourseDesign() {
return state.getCourseDesign();
}
@Override
public Collection<Competitor> getCompetitors() {
return competitors;
}
@Override
public List<MapMarker> getMapMarkers(){
return mapMarkers;
}
@Override
public CourseBase getCourseOnServer() {
return courseOnServer;
}
@Override
public void setCourseOnServer(CourseBase course) {
courseOnServer = course;
}
@Override
public void setCompetitors(Collection<Competitor> competitors) {
this.competitors = competitors;
}
@Override
public void setMapMarkers(List<MapMarker> markers) {
this.mapMarkers = markers;
}
}
package com.sap.sailing.racecommittee.app.domain.impl;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishingTimeFinder;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinder;
import com.sap.sailing.domain.abstractlog.race.state.RaceState;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.SeriesBase;
import com.sap.sailing.domain.base.racegroup.RaceGroup;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.data.AndroidRaceLogResolver;
import com.sap.sailing.racecommittee.app.domain.ManagedRace;
import com.sap.sailing.racecommittee.app.domain.ManagedRaceIdentifier;
import com.sap.sailing.racecommittee.app.domain.MapMarker;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ManagedRaceImpl implements ManagedRace {
private static final long serialVersionUID = -4936566684992524001L;
// private static final String TAG = ManagedRace.class.getName();
private final RaceState state;
private final ManagedRaceIdentifier identifier;
private Collection<Competitor> competitors;
private List<MapMarker> mapMarkers;
private CourseBase courseOnServer;
public ManagedRaceImpl(ManagedRaceIdentifier identifier, RaceState state) {
this.state = state;
this.identifier = identifier;
this.competitors = new ArrayList<Competitor>();
this.courseOnServer = null;
}
@Override
public RaceState getState() {
return state;
}
@Override
public String getId() {
return identifier.getId();
}
@Override
public String getName() {
return identifier.getRaceName();
}
@Override
public String getRaceName() {
return getName();
}
@Override
public Fleet getFleet() {
return identifier.getFleet();
}
@Override
public SeriesBase getSeries() {
return identifier.getSeries();
}
@Override
public RaceGroup getRaceGroup() {
return identifier.getRaceGroup();
}
@Override
public ManagedRaceIdentifier getIdentifier() {
return identifier;
}
@Override
public RaceLog getRaceLog() {
return state.getRaceLog();
}
@Override
public RaceLogRaceStatus getStatus() {
return state.getStatus();
}
@Override
public CourseBase getCourseDesign() {
return state.getCourseDesign();
}
@Override
public Collection<Competitor> getCompetitors() {
return competitors;
}
@Override
public List<MapMarker> getMapMarkers(){
return mapMarkers;
}
@Override
public CourseBase getCourseOnServer() {
return courseOnServer;
}
@Override
public void setCourseOnServer(CourseBase course) {
courseOnServer = course;
}
@Override
public void setCompetitors(Collection<Competitor> competitors) {
this.competitors = competitors;
}
@Override
public void setMapMarkers(List<MapMarker> markers) {
this.mapMarkers = markers;
}
@Override
public Result setFinishedTime(TimePoint finishedTime) {
Result result = new Result();
FinishingTimeFinder ftf = new FinishingTimeFinder(getRaceLog());
if (ftf.analyze() != null) {
if (finishedTime.after(MillisecondsTimePoint.now())) {
result.setError(R.string.error_time_in_future);
} else {
if (ftf.analyze().before(finishedTime)) {
getState().setFinishedTime(finishedTime);
} else {
result.setError(R.string.error_finished_time);
}
}
}
return result;
}
@Override
public Result setFinishingTime(TimePoint finishingTime) {
Result result = new Result();
StartTimeFinder stf = new StartTimeFinder(new AndroidRaceLogResolver(), getRaceLog());
if (stf.analyze() != null) {
if (finishingTime.after(MillisecondsTimePoint.now())) {
result.setError(R.string.error_time_in_future);
} else {
if (stf.analyze().getStartTime().before(finishingTime)) {
getState().setFinishingTime(finishingTime);
} else {
result.setError(R.string.error_finishing_time);
}
}
}
return result;
}
}
@@ -0,0 +1,55 @@
package com.sap.sailing.racecommittee.app.domain.impl;
import android.content.Context;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
public class Result {
public final static int OK = 0;
private int mErrorString;
private Object[] mObjects;
public Result() {
this(OK);
}
public Result(@StringRes int stringRes) {
setError(stringRes);
}
public void resetError() {
mErrorString = OK;
mObjects = null;
}
public void setError(@StringRes int stringRes) {
resetError();
if (stringRes != 0) {
mErrorString = stringRes;
}
}
public void setError(@StringRes int stringRes, @Nullable Object... objects) {
setError(stringRes);
mObjects = objects;
}
public boolean isOk() {
return (mErrorString == OK);
}
public boolean hasError() {
return (mErrorString != OK);
}
public @StringRes int getMessageId() {
return mErrorString;
}
public String getMessage(Context context) {
return context.getString(getMessageId(), mObjects);
}
}
@@ -1,26 +1,16 @@
package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import android.widget.*;
import com.sap.sailing.android.shared.util.ViewHolder;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.FinishingTimeFinder;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.StartTimeFinder;
import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.data.AndroidRaceLogResolver;
import com.sap.sailing.racecommittee.app.domain.impl.Result;
import com.sap.sailing.racecommittee.app.ui.adapters.MoreFlagsAdapter;
import com.sap.sailing.racecommittee.app.ui.adapters.MoreFlagsAdapter.MoreFlag;
import com.sap.sailing.racecommittee.app.ui.adapters.MoreFlagsAdapter.MoreFlagItemClick;
@@ -29,6 +19,9 @@ import com.sap.sailing.racecommittee.app.utils.ThemeHelper;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class MoreFlagsFragment extends BaseFragment implements MoreFlagItemClick {
private MoreFlagsAdapter mAdapter;
@@ -217,45 +210,27 @@ public class MoreFlagsFragment extends BaseFragment implements MoreFlagItemClick
}
private void setFinishTime(TimePoint finishTime) {
Result result = new Result();
switch (getArguments().getInt(START_MODE, 0)) {
case 1: // Race-State: Finishing -> End Finishing
setFinishedTime(finishTime);
if (RaceLogRaceStatus.FINISHING.equals(getRace().getStatus())) {
result = getRace().setFinishedTime(finishTime);
} else {
result.setError(R.string.error_wrong_race_state, RaceLogRaceStatus.FINISHING.name(), getRace().getStatus().name());
}
break;
default: // Race-State: Running -> Start Finishing
setFinishingTime(finishTime);
if (RaceLogRaceStatus.RUNNING.equals(getRace().getStatus())) {
result = getRace().setFinishingTime(finishTime);
} else {
result.setError(R.string.error_wrong_race_state, RaceLogRaceStatus.RUNNING.name(), getRace().getStatus().name());
}
break;
}
}
private void setFinishingTime(TimePoint finishTime) {
StartTimeFinder stf = new StartTimeFinder(new AndroidRaceLogResolver(), getRace().getRaceLog());
if (stf.analyze() != null && getRace().getStatus().equals(RaceLogRaceStatus.RUNNING)) {
if (finishTime.after(MillisecondsTimePoint.now())) {
Toast.makeText(getActivity(), "The selected time is in the future. Please recheck the time.", Toast.LENGTH_LONG).show();
} else {
if (stf.analyze().getStartTime().before(finishTime)) {
getRaceState().setFinishingTime(finishTime);
} else {
Toast.makeText(getActivity(), "The selected time is before the race start.", Toast.LENGTH_LONG).show();
}
}
}
}
private void setFinishedTime(TimePoint finishTime) {
FinishingTimeFinder ftf = new FinishingTimeFinder(getRace().getRaceLog());
if (ftf.analyze() != null && getRace().getStatus().equals(RaceLogRaceStatus.FINISHING)) {
if (finishTime.after(MillisecondsTimePoint.now())) {
Toast.makeText(getActivity(), "The given finish time is in the future. Please recheck the time.", Toast.LENGTH_LONG).show();
} else {
if (ftf.analyze().before(finishTime)) {
getRaceState().setFinishedTime(finishTime);
} else {
Toast.makeText(getActivity(), "The given finish time is earlier than than the first finisher time. Please recheck the time.", Toast.LENGTH_LONG).show();
}
}
if (result.hasError()) {
Toast.makeText(getActivity(), result.getMessageId(), Toast.LENGTH_LONG).show();
}
}
}
@@ -50,6 +50,36 @@ public class RaceSummaryFragment extends BaseFragment {
mRegionWind = ViewHolder.get(layout, R.id.region_wind);
mRegionRecall = ViewHolder.get(layout, R.id.region_individual_recalls);
View editStartTime = ViewHolder.get(layout, R.id.edit_race_start_time);
if (editStartTime != null) {
editStartTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
replaceFragment(RaceTimeChangeFragment.newInstance(RaceTimeChangeFragment.START_TIME_MODE), R.id.finished_content);
}
});
}
View editFinishingTime = ViewHolder.get(layout, R.id.edit_race_finish_begin_time);
if (editFinishingTime != null) {
editFinishingTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
replaceFragment(RaceTimeChangeFragment.newInstance(RaceTimeChangeFragment.FINISHING_TIME_MODE), R.id.finished_content);
}
});
}
View editFinishedTime = ViewHolder.get(layout, R.id.edit_race_finish_end_time);
if (editFinishedTime != null) {
editFinishedTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
replaceFragment(RaceTimeChangeFragment.newInstance(RaceTimeChangeFragment.FINISHED_TIME_MODE), R.id.finished_content);
}
});
}
return layout;
}
@@ -0,0 +1,189 @@
package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo;
import android.content.Intent;
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.NumberPicker;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import com.sap.sailing.racecommittee.app.AppConstants;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sailing.racecommittee.app.domain.impl.Result;
import com.sap.sailing.racecommittee.app.utils.ThemeHelper;
import com.sap.sailing.racecommittee.app.utils.TimeUtils;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import java.util.Calendar;
public class RaceTimeChangeFragment extends BaseFragment implements View.OnClickListener {
public final static int START_TIME_MODE = 0;
public final static int FINISHING_TIME_MODE = 1;
public final static int FINISHED_TIME_MODE = 2;
private final static String START_MODE = "startMode";
private static final int FUTURE_DAYS = 3;
private static final int PAST_DAYS = -3;
private NumberPicker mDatePicker;
private TimePicker mTimePicker;
private NumberPicker mSecondPicker;
public static RaceTimeChangeFragment newInstance(int mode) {
RaceTimeChangeFragment fragment = new RaceTimeChangeFragment();
Bundle args = new Bundle();
args.putInt(START_MODE, mode);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View layout = inflater.inflate(R.layout.race_time_change, container, false);
return layout;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
View layout = getView();
if (layout == null) {
return;
}
final Calendar calendar = Calendar.getInstance();
TextView headerText = (TextView) layout.findViewById(R.id.header_headline);
if (headerText != null) {
switch (getArguments().getInt(START_MODE, 0)) {
case FINISHING_TIME_MODE:
calendar.setTime(getRaceState().getFinishingTime().asDate());
headerText.setText(getString(R.string.race_summary_finish_begin));
break;
case FINISHED_TIME_MODE:
calendar.setTime(getRaceState().getFinishedTime().asDate());
headerText.setText(getString(R.string.race_summary_finish_end));
break;
default: // START_TIME_MODE
calendar.setTime(getRaceState().getStartTime().asDate());
headerText.setText(getString(R.string.race_summary_start));
break;
}
}
mDatePicker = (NumberPicker) layout.findViewById(R.id.date_picker);
if (mDatePicker != null) {
ThemeHelper.setPickerTextColor(getActivity(), mDatePicker, ThemeHelper.getColor(getActivity(), R.attr.white));
TimeUtils.initDatePicker(getActivity(), mDatePicker, calendar, PAST_DAYS, FUTURE_DAYS, false);
mDatePicker.setValue(Math.abs(PAST_DAYS));
mDatePicker.setTag(calendar);
}
mTimePicker = (TimePicker) layout.findViewById(R.id.time_picker);
if (mTimePicker != null) {
ThemeHelper.setPickerTextColor(getActivity(), mTimePicker, ThemeHelper.getColor(getActivity(), R.attr.white));
mTimePicker.setIs24HourView(true);
mTimePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
mTimePicker.setCurrentMinute(calendar.get(Calendar.MINUTE));
}
mSecondPicker = (NumberPicker) layout.findViewById(R.id.second_picker);
if (mSecondPicker != null) {
ThemeHelper.setPickerTextColor(getActivity(), mTimePicker, ThemeHelper.getColor(getActivity(), R.attr.white));
mSecondPicker.setVisibility(View.VISIBLE);
mSecondPicker.setMinValue(0);
mSecondPicker.setMaxValue(59);
mSecondPicker.setValue(calendar.get(Calendar.SECOND));
mSecondPicker.setFormatter(new NumberPicker.Formatter() {
@Override
public String format(int i) {
return String.format("%02d", i);
}
});
mSecondPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
if (mTimePicker != null) {
Calendar pickerTime = (Calendar) calendar.clone();
pickerTime.set(Calendar.HOUR_OF_DAY, mTimePicker.getCurrentHour());
pickerTime.set(Calendar.MINUTE, mTimePicker.getCurrentMinute());
if (oldVal == 0 && newVal == 59) {
pickerTime.add(Calendar.MINUTE, -1);
}
if (oldVal == 59 && newVal == 0) {
pickerTime.add(Calendar.MINUTE, 1);
}
mTimePicker.setCurrentHour(pickerTime.get(Calendar.HOUR_OF_DAY));
mTimePicker.setCurrentMinute(pickerTime.get(Calendar.MINUTE));
}
}
});
}
View setTime = layout.findViewById(R.id.set_date_time);
if (setTime != null) {
setTime.setOnClickListener(this);
}
View header = layout.findViewById(R.id.header);
if (header != null) {
header.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
closeFragment();
}
});
}
}
@Override
public void onClick(View v) {
TimePoint time = getPickerTime();
Result result;
switch (getArguments().getInt(START_MODE)) {
case FINISHING_TIME_MODE:
result = getRace().setFinishingTime(time);
if (result.hasError()) {
Toast.makeText(getActivity(), result.getMessage(getActivity()), Toast.LENGTH_LONG).show();
}
break;
case FINISHED_TIME_MODE:
result = getRace().setFinishedTime(time);
if (result.hasError()) {
Toast.makeText(getActivity(), result.getMessage(getActivity()), Toast.LENGTH_LONG).show();
}
break;
default: // START_TIME_MODE
getRaceState().forceNewStartTime(MillisecondsTimePoint.now(), time);
break;
}
closeFragment();
}
private TimePoint getPickerTime() {
Calendar calendar = (Calendar) mDatePicker.getTag();
calendar.add(Calendar.DAY_OF_MONTH, mDatePicker.getValue() + PAST_DAYS);
calendar.set(Calendar.HOUR_OF_DAY, mTimePicker.getCurrentHour());
calendar.set(Calendar.MINUTE, mTimePicker.getCurrentMinute());
calendar.set(Calendar.SECOND, mSecondPicker.getValue());
calendar.set(Calendar.MILLISECOND, 0);
return new MillisecondsTimePoint(calendar.getTime());
}
private void closeFragment() {
Intent intent = new Intent(AppConstants.INTENT_ACTION_SHOW_SUMMARY_CONTENT);
LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(intent);
}
}
@@ -1,7 +1,6 @@
package com.sap.sailing.racecommittee.app.ui.fragments.raceinfo;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.view.LayoutInflater;
@@ -25,8 +24,6 @@ import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import java.io.Serializable;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;
public class StartTimeFragment extends BaseFragment
@@ -89,7 +86,7 @@ public class StartTimeFragment extends BaseFragment
mMinuteDec.setOnClickListener(this);
}
Button setStart = ViewHolder.get(layout, R.id.set_start_time);
Button setStart = ViewHolder.get(layout, R.id.set_date_time);
if (setStart != null) {
setStart.setOnClickListener(this);
}
@@ -173,13 +170,14 @@ public class StartTimeFragment extends BaseFragment
}
}
mDatePicker = ViewHolder.get(getView(), R.id.start_date_picker);
mDatePicker = ViewHolder.get(getView(), R.id.date_picker);
if (mDatePicker != null) {
ThemeHelper.setPickerTextColor(getActivity(), mDatePicker, ThemeHelper.getColor(getActivity(), R.attr.white));
mDatePicker.setOnValueChangedListener(this);
initDatePicker(time);
TimeUtils.initDatePicker(getActivity(), mDatePicker, time, PAST_DAYS, FUTURE_DAYS);
mDatePicker.setValue(Math.abs(PAST_DAYS));
}
mTimePicker = ViewHolder.get(getView(), R.id.start_time_picker);
mTimePicker = ViewHolder.get(getView(), R.id.time_picker);
if (mTimePicker != null) {
ThemeHelper.setPickerTextColor(getActivity(), mTimePicker, ThemeHelper.getColor(getActivity(), R.attr.white));
mTimePicker.setOnTimeChangedListener(this);
@@ -238,13 +236,14 @@ public class StartTimeFragment extends BaseFragment
mTimeRight.add(Calendar.MINUTE, -1);
timeRight = TimeUtils.formatDurationSince(mTimeRight.getTimeInMillis());
}
}
if (mCountdown != null) {
String countdown = getString(resId).replace("#TIME#", time);
mCountdown.setText(countdown);
mCountdown.setTag(resId);
}
if (mMinuteDec != null) {
String countdown = getString(resId).replace("#TIME#", timeLeft);
if (countdown.equals("-00:00:00")) {
@@ -252,6 +251,7 @@ public class StartTimeFragment extends BaseFragment
}
mMinuteDec.setText(countdown);
}
if (mMinuteInc != null) {
String countdown = getString(resId).replace("#TIME#", timeRight);
if (countdown.equals("-00:00:00")) {
@@ -315,7 +315,7 @@ public class StartTimeFragment extends BaseFragment
setPickerTime();
break;
case R.id.set_start_time:
case R.id.set_date_time:
changeFragment(mStartTime);
break;
@@ -366,40 +366,6 @@ public class StartTimeFragment extends BaseFragment
return new MillisecondsTimePoint(calendar.getTime());
}
private void initDatePicker(Calendar time) {
DateFormat dateFormat = DateFormat.getDateInstance();
ArrayList<String> dates = new ArrayList<>();
Calendar calendar = Calendar.getInstance();
// Past
calendar.add(Calendar.DAY_OF_MONTH, PAST_DAYS);
for (int i = PAST_DAYS; i < -1; i++) {
dates.add(dateFormat.format(calendar.getTime()));
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
dates.add(getString(R.string.yesterday));
dates.add(getString(R.string.today));
dates.add(getString(R.string.tomorrow));
// Future
calendar.add(Calendar.DAY_OF_MONTH, 2);
for (int i = 3; i <= FUTURE_DAYS + 1; i++) {
calendar.add(Calendar.DAY_OF_MONTH, 1);
dates.add(dateFormat.format(calendar.getTime()));
}
mDatePicker.setDisplayedValues(dates.toArray(new String[dates.size()]));
mDatePicker.setMinValue(0);
mDatePicker.setMaxValue(dates.size() - 1);
mDatePicker.setWrapSelectorWheel(false);
mDatePicker.setValue(TimeUtils.daysBetween(time, Calendar.getInstance()) + Math.abs(PAST_DAYS));
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
TextView date = new TextView(getActivity());
date.setText(dateFormat.format(calendar.getTime()));
int padding = getResources().getDimensionPixelSize(R.dimen.default_padding_half);
date.setPadding(padding, padding, padding, padding);
date.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
mDatePicker.getLayoutParams().width = date.getMeasuredWidth();
}
}
private void changeFragment() {
changeFragment(null);
}
@@ -1,12 +1,18 @@
package com.sap.sailing.racecommittee.app.utils;
import java.util.Calendar;
import android.content.Context;
import android.os.Build;
import android.text.format.DateFormat;
import android.view.View;
import android.widget.NumberPicker;
import android.widget.TextView;
import com.sap.sailing.racecommittee.app.R;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import java.util.ArrayList;
import java.util.Calendar;
public class TimeUtils {
private TimeUtils() {
@@ -16,19 +22,21 @@ public class TimeUtils {
public static long timeUntil(TimePoint targetTime) {
return targetTime.asMillis() - MillisecondsTimePoint.now().asMillis();
}
/**
* Formats your time to 'kk:mm:ss'.
*
* @param timePoint timestamp to format
*/
public static String formatTime(TimePoint timePoint) {
return formatTime(timePoint, "kk:mm:ss");
}
/**
* Formats your time with the help of {@link DateFormat}.
*
* @param timePoint timestamp to format
* @param format format as defined by {@link DateFormat}
* @param format format as defined by {@link DateFormat}
* @return timestamp formatted as {@link String}
*/
public static String formatTime(TimePoint timePoint, String format) {
@@ -39,7 +47,7 @@ public class TimeUtils {
int secondsTillStart = (int) Math.floor(milliseconds / 1000f);
return formatDuration(secondsTillStart);
}
public static String formatDurationUntil(long milliseconds) {
int secondsTillStart = (int) Math.ceil(milliseconds / 1000f);
return formatDuration(secondsTillStart);
@@ -73,7 +81,7 @@ public class TimeUtils {
return calendar;
}
public static int daysBetween(Calendar day1, Calendar day2){
public static int daysBetween(Calendar day1, Calendar day2) {
Calendar dayOne = (Calendar) day1.clone();
Calendar dayTwo = (Calendar) day2.clone();
@@ -109,4 +117,50 @@ public class TimeUtils {
String hoursString = hours < 10 ? "0" + Math.abs(hours) : "" + Math.abs(hours);
return String.format(timePattern, hoursString, minutesString, secondsString);
}
}
public static void initDatePicker(Context context, NumberPicker datePicker, Calendar time, int pastDays, int futureDays) {
initDatePicker(context, datePicker, time, pastDays, futureDays, true);
}
public static void initDatePicker(Context context, NumberPicker datePicker, Calendar time, int pastDays, int futureDays, boolean useWords) {
java.text.DateFormat dateFormat = java.text.DateFormat.getDateInstance();
ArrayList<String> dates = new ArrayList<>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(time.getTime());
// Past
calendar.add(Calendar.DAY_OF_MONTH, pastDays);
for (int i = pastDays; i < -1; i++) {
dates.add(dateFormat.format(calendar.getTime()));
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
if (useWords) {
dates.add(context.getString(R.string.yesterday));
dates.add(context.getString(R.string.today));
dates.add(context.getString(R.string.tomorrow));
calendar.add(Calendar.DAY_OF_MONTH, 3);
} else {
for (int i = 0; i < 3; i++) {
dates.add(dateFormat.format(calendar.getTime()));
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
}
// Future
for (int i = 3; i <= futureDays + 1; i++) {
dates.add(dateFormat.format(calendar.getTime()));
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
datePicker.setDisplayedValues(dates.toArray(new String[dates.size()]));
datePicker.setMinValue(0);
datePicker.setMaxValue(dates.size() - 1);
datePicker.setWrapSelectorWheel(false);
datePicker.setValue(TimeUtils.daysBetween(calendar, Calendar.getInstance()) + Math.abs(pastDays));
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
TextView date = new TextView(context);
date.setText(dateFormat.format(calendar.getTime()));
int padding = context.getResources().getDimensionPixelSize(R.dimen.default_padding_half);
date.setPadding(padding, padding, padding, padding);
date.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
datePicker.getLayoutParams().width = date.getMeasuredWidth();
}
}
}