package com.jasonrobinson.racer.ui.ladder;
import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.TextView;
import com.jasonrobinson.racer.R;
import com.jasonrobinson.racer.model.Race;
import com.jasonrobinson.racer.ui.base.BaseFragment;
import com.jasonrobinson.racer.util.RacerTimeUtils;
import com.jasonrobinson.racer.util.RawTypeface;
import com.metova.slim.annotation.Callback;
import com.metova.slim.annotation.Layout;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import butterknife.InjectView;
@Layout(R.layout.racetime_fragment)
public class RaceTimeFragment extends BaseFragment {
DateFormat mDateFormat;
DateFormat mTimeFormat;
RemainingCountdownTimer mRemainingTimer;
@Callback
RaceTimeCallback mRaceTimeCallback;
@InjectView(R.id.raceName)
TextView mNameTextView;
@InjectView(R.id.startTime)
TextView mStartTimeTextView;
@InjectView(R.id.endTime)
TextView mEndTimeTextView;
@InjectView(R.id.countdownTime)
TextView mCountdownTimeTextView;
@InjectView(R.id.countdownText)
TextView mCountdownTextView;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mDateFormat = android.text.format.DateFormat.getDateFormat(getActivity());
mTimeFormat = android.text.format.DateFormat.getTimeFormat(getActivity());
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mNameTextView.setTypeface(RawTypeface.obtain(getActivity(), R.raw.fontin_bold));
}
@Override
public void onDestroyView() {
super.onDestroyView();
if (mRemainingTimer != null) {
mRemainingTimer.cancel();
}
}
public void setData(Race race) {
String name = race.getRaceId();
Date startAt = race.getStartAt();
Date endAt = race.getEndAt();
mNameTextView.setText(name);
boolean includeDate = !(isToday(startAt) && isToday(endAt));
mStartTimeTextView.setText(getFormattedTime(startAt, includeDate));
mEndTimeTextView.setText(getFormattedTime(endAt, includeDate));
if (mRemainingTimer != null) {
mRemainingTimer.cancel();
}
long remaining = endAt.getTime() - System.currentTimeMillis();
mRemainingTimer = new RemainingCountdownTimer(startAt.getTime(), remaining);
mRemainingTimer.start();
}
private boolean isToday(Date date) {
Calendar now = Calendar.getInstance(Locale.getDefault());
Calendar then = Calendar.getInstance(Locale.getDefault());
then.setTime(date);
return now.get(Calendar.DAY_OF_YEAR) == then.get(Calendar.DAY_OF_YEAR);
}
private CharSequence getFormattedTime(Date date, boolean includeDate) {
StringBuilder sb = new StringBuilder();
if (includeDate) {
sb.append(mDateFormat.format(date));
sb.append("\n");
}
sb.append(mTimeFormat.format(date));
return sb;
}
public interface RaceTimeCallback {
public void onRaceFinished();
}
private class RemainingCountdownTimer extends CountDownTimer {
private long mStartTime;
public RemainingCountdownTimer(long startTime, long millisInFuture) {
super(millisInFuture, 1000);
mStartTime = startTime;
}
@Override
public void onFinish() {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
mCountdownTimeTextView.setText(R.string.finished);
mRaceTimeCallback.onRaceFinished();
}
});
}
@Override
public void onTick(long millisUntilFinished) {
long timeToStart = mStartTime - System.currentTimeMillis();
long seconds;
if (timeToStart > 0) {
seconds = timeToStart / 1000;
mCountdownTextView.setText(R.string.starting_in);
} else {
seconds = millisUntilFinished / 1000;
mCountdownTextView.setText(R.string.remaining);
}
mCountdownTimeTextView.setText(RacerTimeUtils.formatElapsedTime(seconds));
}
}
}