blob: d655e8516b5ad61e69c4ee7d9c4a8a4f602bf676 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package android.support.v17.leanback.widget;
import android.content.Context;
import android.os.Bundle;
import android.support.v17.leanback.widget.picker.DatePicker;
import java.util.Calendar;
import java.util.TimeZone;
/**
* Subclass of GuidedAction that can choose a date. The Action is editable by default; to make it
* read only, call hasEditableActivatorView(false) on the Builder.
*/
public class GuidedDatePickerAction extends GuidedAction {
/**
* Base Builder class to build GuidedDatePickerAction. Subclass this BuilderBase when app needs
* to subclass GuidedDatePickerAction, implement your build() which should call
* {@link #applyDatePickerValues(GuidedDatePickerAction)}. When using GuidedDatePickerAction
* directly, use {@link Builder}.
*/
public abstract static class BuilderBase<B extends BuilderBase>
extends GuidedAction.BuilderBase<B> {
private String mDatePickerFormat;
private long mDate;
private long mMinDate = Long.MIN_VALUE;
private long mMaxDate = Long.MAX_VALUE;
public BuilderBase(Context context) {
super(context);
Calendar c = Calendar.getInstance();
mDate = c.getTimeInMillis();
hasEditableActivatorView(true);
}
/**
* Sets format of date Picker or null for default. The format is a case insensitive String
* containing the day ('d'), month ('m'), and year ('y'). When the format is not specified,
* a default format of current locale will be used.
* @param format Format of showing Date, e.g. "YMD".
* @return This Builder object.
*/
public B datePickerFormat(String format) {
mDatePickerFormat = format;
return (B) this;
}
/**
* Sets a Date for date picker in milliseconds since January 1, 1970 00:00:00 in
* {@link TimeZone#getDefault()} time zone.
* @return This Builder Object.
*/
public B date(long date) {
mDate = date;
return (B) this;
}
/**
* Sets minimal Date for date picker in milliseconds since January 1, 1970 00:00:00 in
* {@link TimeZone#getDefault()} time zone.
* @return This Builder Object.
*/
public B minDate(long minDate) {
mMinDate = minDate;
return (B) this;
}
/**
* Sets maximum Date for date picker in milliseconds since January 1, 1970 00:00:00 in
* {@link TimeZone#getDefault()} time zone.
* @return This Builder Object.
*/
public B maxDate(long maxDate) {
mMaxDate = maxDate;
return (B) this;
}
/**
* Apply values to GuidedDatePickerAction.
* @param action GuidedDatePickerAction to apply values.
*/
protected final void applyDatePickerValues(GuidedDatePickerAction action) {
super.applyValues(action);
action.mDatePickerFormat = mDatePickerFormat;
action.mDate = mDate;
if (mMinDate > mMaxDate) {
throw new IllegalArgumentException("MinDate cannot be larger than MaxDate");
}
action.mMinDate = mMinDate;
action.mMaxDate = mMaxDate;
}
}
/**
* Builder class to build a GuidedDatePickerAction.
*/
public final static class Builder extends BuilderBase<Builder> {
public Builder(Context context) {
super(context);
}
/**
* Builds the GuidedDatePickerAction corresponding to this Builder.
* @return The GuidedDatePickerAction as configured through this Builder.
*/
public GuidedDatePickerAction build() {
GuidedDatePickerAction action = new GuidedDatePickerAction();
applyDatePickerValues(action);
return action;
}
}
String mDatePickerFormat;
long mDate;
long mMinDate = Long.MIN_VALUE;
long mMaxDate = Long.MAX_VALUE;
/**
* Returns format of date Picker or null if not specified. The format is a case insensitive
* String containing the * day ('d'), month ('m'), and year ('y'). When the format is not
* specified, a default format of current locale will
* be used.
* @return Format of showing Date, e.g. "YMD". Returns null if using current locale's default.
*/
public String getDatePickerFormat() {
return mDatePickerFormat;
}
/**
* Get current value of DatePicker in milliseconds since January 1, 1970 00:00:00 in
* {@link TimeZone#getDefault()} time zone.
* @return Current value of DatePicker Action.
*/
public long getDate() {
return mDate;
}
/**
* Sets current value of DatePicker in milliseconds since January 1, 1970 00:00:00 in
* {@link TimeZone#getDefault()} time zone.
* @param date New value to update current value of DatePicker Action.
*/
public void setDate(long date) {
mDate = date;
}
/**
* Get minimal value of DatePicker in milliseconds since January 1, 1970 00:00:00 in
* {@link TimeZone#getDefault()} time zone. -1 if not set.
* @return Minimal value of DatePicker Action or Long.MIN_VALUE if not set.
*/
public long getMinDate() {
return mMinDate;
}
/**
* Get maximum value of DatePicker in milliseconds since January 1, 1970 00:00:00 in
* {@link TimeZone#getDefault()} time zone.
* @return Maximum value of DatePicker Action or Long.MAX_VALUE if not set.
*/
public long getMaxDate() {
return mMaxDate;
}
@Override
public void onSaveInstanceState(Bundle bundle, String key) {
bundle.putLong(key, getDate());
}
@Override
public void onRestoreInstanceState(Bundle bundle, String key) {
setDate(bundle.getLong(key, getDate()));
}
}