RCApp: implementing time change fragments

This commit is contained in:
Peter Siegmund committed 2015-06-20 16:11:16 +02:00
1 parent 1a749cb78d
commit 0cb59907e4
22 files changed
+408 -138

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,15 +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"
tools:visibility="visible"/>
android:src="?create"
android:visibility="visible"/>
<TextView
android:id="@+id/race_start_time"
@@ -69,12 +68,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 +87,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 +103,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 +112,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 +126,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 +142,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 +151,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 +165,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 +174,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 +188,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 +201,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 +210,7 @@
android:layout_weight="2"
android:gravity="right"
android:textAppearance="?attr/textNormal"
tools:text="from 192°" />
tools:text="from 192°"/>
</LinearLayout>
<LinearLayout
@@ -227,17 +224,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 +249,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 +261,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,53 @@
<?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: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"/>
</LinearLayout>
<Button
android:id="@+id/set_date_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_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>
@@ -427,5 +427,6 @@
<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>
@@ -43,7 +43,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>
@@ -447,5 +447,6 @@
<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>
@@ -57,7 +57,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>
@@ -60,7 +60,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>
@@ -1,6 +1,7 @@
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 {
@@ -8,6 +9,7 @@ public class Result {
public final static int OK = 0;
private int mErrorString;
private Object[] mObjects;
public Result() {
this(OK);
@@ -19,6 +21,7 @@ public class Result {
public void resetError() {
mErrorString = OK;
mObjects = null;
}
public void setError(@StringRes int stringRes) {
@@ -29,6 +32,11 @@ public class Result {
}
}
public void setError(@StringRes int stringRes, @Nullable Object... objects) {
setError(stringRes);
mObjects = objects;
}
public boolean isOk() {
return (mErrorString == OK);
}
@@ -42,6 +50,6 @@ public class Result {
}
public String getMessage(Context context) {
return context.getString(getMessageId());
return context.getString(getMessageId(), mObjects);
}
}
@@ -210,22 +210,26 @@ public class MoreFlagsFragment extends BaseFragment implements MoreFlagItemClick
}
private void setFinishTime(TimePoint finishTime) {
Result result = null;
Result result = new Result();
switch (getArguments().getInt(START_MODE, 0)) {
case 1: // Race-State: Finishing -> End Finishing
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
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;
}
if (result != null && result.hasError()) {
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,157 @@
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 {
private final static String START_MODE = "startMode";
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 static final int FUTURE_DAYS = 25;
private static final int PAST_DAYS = -3;
private NumberPicker mDatePicker;
private TimePicker mTimePicker;
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;
}
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);
int days = TimeUtils.daysBetween(Calendar.getInstance(), calendar) + Math.abs(PAST_DAYS);
mDatePicker.setValue(days);
}
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));
}
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.getInstance();
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, 0);
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,13 @@ 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);
}
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);
@@ -315,7 +312,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 +363,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() {
@@ -109,4 +115,38 @@ 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) {
java.text.DateFormat dateFormat = java.text.DateFormat.getDateInstance();
ArrayList<String> dates = new ArrayList<>();
Calendar calendar = Calendar.getInstance();
// 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);
}
dates.add(context.getString(R.string.yesterday));
dates.add(context.getString(R.string.today));
dates.add(context.getString(R.string.tomorrow));
// Future
calendar.add(Calendar.DAY_OF_MONTH, 2);
for (int i = 3; i <= futureDays + 1; i++) {
calendar.add(Calendar.DAY_OF_MONTH, 1);
dates.add(dateFormat.format(calendar.getTime()));
}
datePicker.setDisplayedValues(dates.toArray(new String[dates.size()]));
datePicker.setMinValue(0);
datePicker.setMaxValue(dates.size() - 1);
datePicker.setWrapSelectorWheel(false);
datePicker.setValue(TimeUtils.daysBetween(time, 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();
}
}
}