• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the License
10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11  * or implied. See the License for the specific language governing permissions and limitations under
12  * the License.
13  */
14 package android.support.v17.leanback.widget;
15 
16 import android.content.Context;
17 import android.os.Bundle;
18 import android.support.v17.leanback.widget.picker.DatePicker;
19 
20 import java.util.Calendar;
21 import java.util.TimeZone;
22 
23 /**
24  * Subclass of GuidedAction that can choose a date.  The Action is editable by default; to make it
25  * read only, call hasEditableActivatorView(false) on the Builder.
26  */
27 public class GuidedDatePickerAction extends GuidedAction {
28 
29     /**
30      * Base Builder class to build GuidedDatePickerAction.  Subclass this BuilderBase when app needs
31      * to subclass GuidedDatePickerAction, implement your build() which should call
32      * {@link #applyDatePickerValues(GuidedDatePickerAction)}.  When using GuidedDatePickerAction
33      * directly, use {@link Builder}.
34      */
35     public abstract static class BuilderBase<B extends BuilderBase>
36             extends GuidedAction.BuilderBase<B> {
37 
38         private String mDatePickerFormat;
39         private long mDate;
40         private long mMinDate = Long.MIN_VALUE;
41         private long mMaxDate = Long.MAX_VALUE;
42 
BuilderBase(Context context)43         public BuilderBase(Context context) {
44             super(context);
45             Calendar c = Calendar.getInstance();
46             mDate = c.getTimeInMillis();
47             hasEditableActivatorView(true);
48         }
49 
50         /**
51          * Sets format of date Picker or null for default.  The format is a case insensitive String
52          * containing the day ('d'), month ('m'), and year ('y').  When the format is not specified,
53          * a default format of current locale will be used.
54          * @param format Format of showing Date, e.g. "YMD".
55          * @return This Builder object.
56          */
datePickerFormat(String format)57         public B datePickerFormat(String format) {
58             mDatePickerFormat = format;
59             return (B) this;
60         }
61 
62         /**
63          * Sets a Date for date picker in milliseconds since January 1, 1970 00:00:00 in
64          * {@link TimeZone#getDefault()} time zone.
65          * @return This Builder Object.
66          */
date(long date)67         public B date(long date) {
68             mDate = date;
69             return (B) this;
70         }
71 
72         /**
73          * Sets minimal Date for date picker in milliseconds since January 1, 1970 00:00:00 in
74          * {@link TimeZone#getDefault()} time zone.
75          * @return This Builder Object.
76          */
minDate(long minDate)77         public B minDate(long minDate) {
78             mMinDate = minDate;
79             return (B) this;
80         }
81 
82         /**
83          * Sets maximum Date for date picker in milliseconds since January 1, 1970 00:00:00 in
84          * {@link TimeZone#getDefault()} time zone.
85          * @return This Builder Object.
86          */
maxDate(long maxDate)87         public B maxDate(long maxDate) {
88             mMaxDate = maxDate;
89             return (B) this;
90         }
91 
92         /**
93          * Apply values to GuidedDatePickerAction.
94          * @param action GuidedDatePickerAction to apply values.
95          */
applyDatePickerValues(GuidedDatePickerAction action)96         protected final void applyDatePickerValues(GuidedDatePickerAction action) {
97             super.applyValues(action);
98             action.mDatePickerFormat = mDatePickerFormat;
99             action.mDate = mDate;
100             if (mMinDate > mMaxDate) {
101                 throw new IllegalArgumentException("MinDate cannot be larger than MaxDate");
102             }
103             action.mMinDate = mMinDate;
104             action.mMaxDate = mMaxDate;
105         }
106 
107     }
108 
109     /**
110      * Builder class to build a GuidedDatePickerAction.
111      */
112     public final static class Builder extends BuilderBase<Builder> {
Builder(Context context)113         public Builder(Context context) {
114             super(context);
115         }
116 
117         /**
118          * Builds the GuidedDatePickerAction corresponding to this Builder.
119          * @return The GuidedDatePickerAction as configured through this Builder.
120          */
build()121         public GuidedDatePickerAction build() {
122             GuidedDatePickerAction action = new GuidedDatePickerAction();
123             applyDatePickerValues(action);
124             return action;
125         }
126     }
127 
128     private String mDatePickerFormat;
129     private long mDate;
130     private long mMinDate = Long.MIN_VALUE;
131     private long mMaxDate = Long.MAX_VALUE;
132 
133     /**
134      * Returns format of date Picker or null if not specified.  The format is a case insensitive
135      * String containing the * day ('d'), month ('m'), and year ('y'). When the format is not
136      * specified, a default format of current locale will
137      * be used.
138      * @return Format of showing Date, e.g. "YMD".  Returns null if using current locale's default.
139      */
getDatePickerFormat()140     public String getDatePickerFormat() {
141         return mDatePickerFormat;
142     }
143 
144     /**
145      * Get current value of DatePicker in milliseconds since January 1, 1970 00:00:00 in
146      * {@link TimeZone#getDefault()} time zone.
147      * @return Current value of DatePicker Action.
148      */
getDate()149     public long getDate() {
150         return mDate;
151     }
152 
153     /**
154      * Sets current value of DatePicker in milliseconds since January 1, 1970 00:00:00 in
155      * {@link TimeZone#getDefault()} time zone.
156      * @param date New value to update current value of DatePicker Action.
157      */
setDate(long date)158     public void setDate(long date) {
159         mDate = date;
160     }
161 
162     /**
163      * Get minimal value of DatePicker in milliseconds since January 1, 1970 00:00:00 in
164      * {@link TimeZone#getDefault()} time zone.  -1 if not set.
165      * @return Minimal value of DatePicker Action or Long.MIN_VALUE if not set.
166      */
getMinDate()167     public long getMinDate() {
168         return mMinDate;
169     }
170 
171     /**
172      * Get maximum value of DatePicker in milliseconds since January 1, 1970 00:00:00 in
173      * {@link TimeZone#getDefault()} time zone.
174      * @return Maximum value of DatePicker Action or Long.MAX_VALUE if not set.
175      */
getMaxDate()176     public long getMaxDate() {
177         return mMaxDate;
178     }
179 
180     @Override
onSaveInstanceState(Bundle bundle, String key)181     public void onSaveInstanceState(Bundle bundle, String key) {
182         bundle.putLong(key, getDate());
183     }
184 
185     @Override
onRestoreInstanceState(Bundle bundle, String key)186     public void onRestoreInstanceState(Bundle bundle, String key) {
187         setDate(bundle.getLong(key, getDate()));
188     }
189 }
190