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