Home | History | Annotate | Download | only in widget
      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 androidx.leanback.widget;
     15 
     16 import android.content.Context;
     17 import android.os.Bundle;
     18 
     19 import java.util.Calendar;
     20 import 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  */
     26 public 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