package com.github.jjobes.slidedatetimepicker;
import java.util.Date;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
/**
* <p>This class contains methods for the library client to create
* a new {@code SlideDateTimePicker}.</p>
*
* <p>It also implements a Builder API that offers more convenient
* object creation.</p>
*
* @author jjobes
*
*/
public class SlideDateTimePicker
{
public static final int HOLO_DARK = 1;
public static final int HOLO_LIGHT = 2;
private FragmentManager mFragmentManager;
private SlideDateTimeListener mListener;
private Date mInitialDate;
private Date mMinDate;
private Date mMaxDate;
private boolean mIsClientSpecified24HourTime;
private boolean mIs24HourTime;
private int mTheme;
private int mIndicatorColor;
/**
* Creates a new instance of {@code SlideDateTimePicker}.
*
* @param fm The {@code FragmentManager} from the calling activity that is used
* internally to show the {@code DialogFragment}.
*/
public SlideDateTimePicker(FragmentManager fm)
{
// See if there are any DialogFragments from the FragmentManager
FragmentTransaction ft = fm.beginTransaction();
Fragment prev = fm.findFragmentByTag(SlideDateTimeDialogFragment.TAG_SLIDE_DATE_TIME_DIALOG_FRAGMENT);
// Remove if found
if (prev != null)
{
ft.remove(prev);
ft.commit();
}
mFragmentManager = fm;
}
/**
* <p>Sets the listener that is used to inform the client when
* the user selects a new date and time.</p>
*
* <p>This must be called before {@link #show()}.</p>
*
* @param listener
*/
public void setListener(SlideDateTimeListener listener)
{
mListener = listener;
}
/**
* <p>Sets the initial date and time to display in the date
* and time pickers.</p>
*
* <p>If this method is not called, the current date and time
* will be displayed.</p>
*
* @param initialDate the {@code Date} object used to determine the
* initial date and time to display
*/
public void setInitialDate(Date initialDate)
{
mInitialDate = initialDate;
}
/**
* <p>Sets the minimum date that the DatePicker should show.</p>
*
* <p>This must be called before {@link #show()}.</p>
*
* @param minDate the minimum selectable date for the DatePicker
*/
public void setMinDate(Date minDate)
{
mMinDate = minDate;
}
/**
* <p>Sets the maximum date that the DatePicker should show.</p>
*
* <p>This must be called before {@link #show()}.</p>
*
* @param maxDate the maximum selectable date for the DatePicker
*/
public void setMaxDate(Date maxDate)
{
mMaxDate = maxDate;
}
private void setIsClientSpecified24HourTime(boolean isClientSpecified24HourTime)
{
mIsClientSpecified24HourTime = isClientSpecified24HourTime;
}
/**
* <p>Sets whether the TimePicker displays its time in 12-hour
* (AM/PM) or 24-hour format.</p>
*
* <p>If this method is not called, the device's default time
* format is used.</p>
*
* <p>This also affects the time displayed in the tab.</p>
*
* <p>Must be called before {@link #show()}.</p>
*
* @param is24HourTime <tt>true</tt> to force 24-hour time format,
* <tt>false</tt> to force 12-hour (AM/PM) time
* format.
*/
public void setIs24HourTime(boolean is24HourTime)
{
setIsClientSpecified24HourTime(true);
mIs24HourTime = is24HourTime;
}
/**
* Sets the theme of the dialog. If no theme is specified, it
* defaults to holo light.
*
* @param theme {@code SlideDateTimePicker.HOLO_DARK} for a dark theme, or
* {@code SlideDateTimePicker.HOLO_LIGHT} for a light theme
*/
public void setTheme(int theme)
{
mTheme = theme;
}
/**
* Sets the color of the underline for the currently selected tab.
*
* @param indicatorColor the color of the selected tab's underline
*/
public void setIndicatorColor(int indicatorColor)
{
mIndicatorColor = indicatorColor;
}
/**
* Shows the dialog to the user. Make sure to call
* {@link #setListener()} before calling this.
*/
public void show()
{
if (mListener == null)
{
throw new NullPointerException(
"Attempting to bind null listener to SlideDateTimePicker");
}
if (mInitialDate == null)
{
setInitialDate(new Date());
}
SlideDateTimeDialogFragment dialogFragment =
SlideDateTimeDialogFragment.newInstance(
mListener,
mInitialDate,
mMinDate,
mMaxDate,
mIsClientSpecified24HourTime,
mIs24HourTime,
mTheme,
mIndicatorColor);
dialogFragment.show(mFragmentManager,
SlideDateTimeDialogFragment.TAG_SLIDE_DATE_TIME_DIALOG_FRAGMENT);
}
/*
* The following implements the builder API to simplify
* creation and display of the dialog.
*/
public static class Builder
{
// Required
private FragmentManager fm;
private SlideDateTimeListener listener;
// Optional
private Date initialDate;
private Date minDate;
private Date maxDate;
private boolean isClientSpecified24HourTime;
private boolean is24HourTime;
private int theme;
private int indicatorColor;
public Builder(FragmentManager fm)
{
this.fm = fm;
}
/**
* @see SlideDateTimePicker#setListener(SlideDateTimeListener)
*/
public Builder setListener(SlideDateTimeListener listener)
{
this.listener = listener;
return this;
}
/**
* @see SlideDateTimePicker#setInitialDate(Date)
*/
public Builder setInitialDate(Date initialDate)
{
this.initialDate = initialDate;
return this;
}
/**
* @see SlideDateTimePicker#setMinDate(Date)
*/
public Builder setMinDate(Date minDate)
{
this.minDate = minDate;
return this;
}
/**
* @see SlideDateTimePicker#setMaxDate(Date)
*/
public Builder setMaxDate(Date maxDate)
{
this.maxDate = maxDate;
return this;
}
/**
* @see SlideDateTimePicker#setIs24HourTime(boolean)
*/
public Builder setIs24HourTime(boolean is24HourTime)
{
this.isClientSpecified24HourTime = true;
this.is24HourTime = is24HourTime;
return this;
}
/**
* @see SlideDateTimePicker#setTheme(int)
*/
public Builder setTheme(int theme)
{
this.theme = theme;
return this;
}
/**
* @see SlideDateTimePicker#setIndicatorColor(int)
*/
public Builder setIndicatorColor(int indicatorColor)
{
this.indicatorColor = indicatorColor;
return this;
}
/**
* <p>Build and return a {@code SlideDateTimePicker} object based on the previously
* supplied parameters.</p>
*
* <p>You should call {@link #show()} immediately after this.</p>
*
* @return
*/
public SlideDateTimePicker build()
{
SlideDateTimePicker picker = new SlideDateTimePicker(fm);
picker.setListener(listener);
picker.setInitialDate(initialDate);
picker.setMinDate(minDate);
picker.setMaxDate(maxDate);
picker.setIsClientSpecified24HourTime(isClientSpecified24HourTime);
picker.setIs24HourTime(is24HourTime);
picker.setTheme(theme);
picker.setIndicatorColor(indicatorColor);
return picker;
}
}
}