Home | History | Annotate | Download | only in datepicker
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.contacts.datepicker;
     18 
     19 // This is a fork of the standard Android DatePicker that additionally allows toggling the year
     20 // on/off.
     21 
     22 import android.app.AlertDialog;
     23 import android.content.Context;
     24 import android.content.DialogInterface;
     25 import android.content.DialogInterface.OnClickListener;
     26 import android.os.Bundle;
     27 import android.view.LayoutInflater;
     28 import android.view.View;
     29 
     30 import com.android.contacts.R;
     31 import com.android.contacts.common.util.DateUtils;
     32 import com.android.contacts.datepicker.DatePicker.OnDateChangedListener;
     33 
     34 import java.text.DateFormat;
     35 import java.util.Calendar;
     36 
     37 /**
     38  * A simple dialog containing an {@link DatePicker}.
     39  *
     40  * <p>See the <a href="{@docRoot}resources/tutorials/views/hello-datepicker.html">Date Picker
     41  * tutorial</a>.</p>
     42  */
     43 public class DatePickerDialog extends AlertDialog implements OnClickListener,
     44         OnDateChangedListener {
     45 
     46     /** Magic year that represents "no year" */
     47     public static int NO_YEAR = DatePicker.NO_YEAR;
     48 
     49     private static final String YEAR = "year";
     50     private static final String MONTH = "month";
     51     private static final String DAY = "day";
     52     private static final String YEAR_OPTIONAL = "year_optional";
     53 
     54     private final DatePicker mDatePicker;
     55     private final OnDateSetListener mCallBack;
     56     private final DateFormat mTitleDateFormat;
     57     private final DateFormat mTitleNoYearDateFormat;
     58 
     59     private int mInitialYear;
     60     private int mInitialMonth;
     61     private int mInitialDay;
     62 
     63     /**
     64      * The callback used to indicate the user is done filling in the date.
     65      */
     66     public interface OnDateSetListener {
     67         /**
     68          * @param view The view associated with this listener.
     69          * @param year The year that was set or {@link DatePickerDialog#NO_YEAR} if the user has
     70          *  not specified a year
     71          * @param monthOfYear The month that was set (0-11) for compatibility
     72          *  with {@link java.util.Calendar}.
     73          * @param dayOfMonth The day of the month that was set.
     74          */
     75         void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth);
     76     }
     77 
     78     /**
     79      * @param context The context the dialog is to run in.
     80      * @param callBack How the parent is notified that the date is set.
     81      * @param year The initial year of the dialog
     82      * @param monthOfYear The initial month of the dialog.
     83      * @param dayOfMonth The initial day of the dialog.
     84      */
     85     public DatePickerDialog(Context context,
     86             OnDateSetListener callBack,
     87             int year,
     88             int monthOfYear,
     89             int dayOfMonth) {
     90         this(context, callBack, year, monthOfYear, dayOfMonth, false);
     91     }
     92 
     93     /**
     94      * @param context The context the dialog is to run in.
     95      * @param callBack How the parent is notified that the date is set.
     96      * @param year The initial year of the dialog or {@link DatePickerDialog#NO_YEAR} if no year
     97      *  has been specified
     98      * @param monthOfYear The initial month of the dialog.
     99      * @param dayOfMonth The initial day of the dialog.
    100      * @param yearOptional Whether the year can be toggled by the user
    101      */
    102     public DatePickerDialog(Context context,
    103             OnDateSetListener callBack,
    104             int year,
    105             int monthOfYear,
    106             int dayOfMonth,
    107             boolean yearOptional) {
    108         this(context, THEME_DEVICE_DEFAULT_LIGHT, callBack, year, monthOfYear, dayOfMonth,
    109                 yearOptional);
    110     }
    111 
    112     /**
    113      * @param context The context the dialog is to run in.
    114      * @param theme the theme to apply to this dialog
    115      * @param callBack How the parent is notified that the date is set.
    116      * @param year The initial year of the dialog or {@link DatePickerDialog#NO_YEAR} if no year
    117      *  has been specified
    118      * @param monthOfYear The initial month of the dialog.
    119      * @param dayOfMonth The initial day of the dialog.
    120      */
    121     public DatePickerDialog(Context context,
    122             int theme,
    123             OnDateSetListener callBack,
    124             int year,
    125             int monthOfYear,
    126             int dayOfMonth) {
    127         this(context, theme, callBack, year, monthOfYear, dayOfMonth, false);
    128     }
    129 
    130     /**
    131      * @param context The context the dialog is to run in.
    132      * @param theme the theme to apply to this dialog
    133      * @param callBack How the parent is notified that the date is set.
    134      * @param year The initial year of the dialog or {@link DatePickerDialog#NO_YEAR} if no
    135      *  year has been specified.
    136      * @param monthOfYear The initial month of the dialog.
    137      * @param dayOfMonth The initial day of the dialog.
    138      * @param yearOptional Whether the year can be toggled by the user
    139      */
    140     public DatePickerDialog(Context context,
    141             int theme,
    142             OnDateSetListener callBack,
    143             int year,
    144             int monthOfYear,
    145             int dayOfMonth,
    146             boolean yearOptional) {
    147         super(context, theme);
    148 
    149         mCallBack = callBack;
    150         mInitialYear = year;
    151         mInitialMonth = monthOfYear;
    152         mInitialDay = dayOfMonth;
    153 
    154         mTitleDateFormat = DateFormat.getDateInstance(DateFormat.FULL);
    155         mTitleNoYearDateFormat = DateUtils.getLocalizedDateFormatWithoutYear(getContext());
    156         updateTitle(mInitialYear, mInitialMonth, mInitialDay);
    157 
    158         setButton(BUTTON_POSITIVE, context.getText(R.string.date_time_set),
    159                 this);
    160         setButton(BUTTON_NEGATIVE, context.getText(android.R.string.cancel),
    161                 (OnClickListener) null);
    162 
    163         LayoutInflater inflater =
    164                 (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    165         View view = inflater.inflate(R.layout.date_picker_dialog, null);
    166         setView(view);
    167         mDatePicker = (DatePicker) view.findViewById(R.id.datePicker);
    168         mDatePicker.init(mInitialYear, mInitialMonth, mInitialDay, yearOptional, this);
    169     }
    170 
    171     @Override
    172     public void onClick(DialogInterface dialog, int which) {
    173         if (mCallBack != null) {
    174             mDatePicker.clearFocus();
    175             mCallBack.onDateSet(mDatePicker, mDatePicker.getYear(),
    176                     mDatePicker.getMonth(), mDatePicker.getDayOfMonth());
    177         }
    178     }
    179 
    180     @Override
    181     public void onDateChanged(DatePicker view, int year, int month, int day) {
    182         updateTitle(year, month, day);
    183     }
    184 
    185     public void updateDate(int year, int monthOfYear, int dayOfMonth) {
    186         mInitialYear = year;
    187         mInitialMonth = monthOfYear;
    188         mInitialDay = dayOfMonth;
    189         mDatePicker.updateDate(year, monthOfYear, dayOfMonth);
    190     }
    191 
    192     private void updateTitle(int year, int month, int day) {
    193         final Calendar calendar = Calendar.getInstance();
    194         calendar.set(Calendar.YEAR, year);
    195         calendar.set(Calendar.MONTH, month);
    196         calendar.set(Calendar.DAY_OF_MONTH, day);
    197         final DateFormat dateFormat =
    198                 year == NO_YEAR ? mTitleNoYearDateFormat : mTitleDateFormat;
    199         setTitle(dateFormat.format(calendar.getTime()));
    200     }
    201 
    202     @Override
    203     public Bundle onSaveInstanceState() {
    204         Bundle state = super.onSaveInstanceState();
    205         state.putInt(YEAR, mDatePicker.getYear());
    206         state.putInt(MONTH, mDatePicker.getMonth());
    207         state.putInt(DAY, mDatePicker.getDayOfMonth());
    208         state.putBoolean(YEAR_OPTIONAL, mDatePicker.isYearOptional());
    209         return state;
    210     }
    211 
    212     @Override
    213     public void onRestoreInstanceState(Bundle savedInstanceState) {
    214         super.onRestoreInstanceState(savedInstanceState);
    215         int year = savedInstanceState.getInt(YEAR);
    216         int month = savedInstanceState.getInt(MONTH);
    217         int day = savedInstanceState.getInt(DAY);
    218         boolean yearOptional = savedInstanceState.getBoolean(YEAR_OPTIONAL);
    219         mDatePicker.init(year, month, day, yearOptional, this);
    220         updateTitle(year, month, day);
    221     }
    222 }
    223