Home | History | Annotate | Download | only in widget
      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.googlecode.android_scripting.widget;
     18 
     19 import android.content.Context;
     20 import android.util.AttributeSet;
     21 import android.view.LayoutInflater;
     22 import android.widget.FrameLayout;
     23 
     24 import com.googlecode.android_scripting.R;
     25 
     26 /**
     27  * A view for selecting the a duration using days, hours, minutes, and seconds.
     28  */
     29 public class DurationPicker extends FrameLayout {
     30 
     31   private int mCurrentDay = 0; // 0-99
     32   private int mCurrentHour = 0; // 0-23
     33   private int mCurrentMinute = 0; // 0-59
     34   private int mCurrentSecond = 0; // 0-59
     35 
     36   private final NumberPicker mDayPicker;
     37   private final NumberPicker mHourPicker;
     38   private final NumberPicker mMinutePicker;
     39   private final NumberPicker mSecondPicker;
     40 
     41   public DurationPicker(Context context) {
     42     this(context, null);
     43   }
     44 
     45   public DurationPicker(Context context, AttributeSet attrs) {
     46     this(context, attrs, 0);
     47   }
     48 
     49   public DurationPicker(Context context, AttributeSet attrs, int defStyle) {
     50     super(context, attrs, defStyle);
     51     LayoutInflater inflater =
     52         (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     53     inflater.inflate(R.layout.duration_picker, this, true);
     54 
     55     mDayPicker = (NumberPicker) findViewById(R.id.day);
     56     mDayPicker.setRange(0, 99);
     57     mDayPicker.setSpeed(100);
     58     // mHourPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
     59     mDayPicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
     60       public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
     61         mCurrentDay = newVal;
     62       }
     63     });
     64 
     65     mHourPicker = (NumberPicker) findViewById(R.id.hour);
     66     mHourPicker.setRange(0, 23);
     67     mHourPicker.setSpeed(100);
     68     // mHourPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
     69     mHourPicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
     70       public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
     71         mCurrentHour = newVal;
     72       }
     73     });
     74 
     75     mMinutePicker = (NumberPicker) findViewById(R.id.minute);
     76     mMinutePicker.setRange(0, 59);
     77     mMinutePicker.setSpeed(100);
     78     mMinutePicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
     79     mMinutePicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
     80       public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
     81         mCurrentMinute = newVal;
     82       }
     83     });
     84 
     85     mSecondPicker = (NumberPicker) findViewById(R.id.second);
     86     mSecondPicker.setRange(0, 59);
     87     mSecondPicker.setSpeed(100);
     88     mSecondPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
     89     mSecondPicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
     90       public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
     91         mCurrentSecond = newVal;
     92       }
     93     });
     94   }
     95 
     96   @Override
     97   public void setEnabled(boolean enabled) {
     98     super.setEnabled(enabled);
     99     mDayPicker.setEnabled(enabled);
    100     mHourPicker.setEnabled(enabled);
    101     mMinutePicker.setEnabled(enabled);
    102     mSecondPicker.setEnabled(enabled);
    103   }
    104 
    105   /**
    106    * Returns the current day.
    107    */
    108   public Integer getCurrentDay() {
    109     return mCurrentDay;
    110   }
    111 
    112   /**
    113    * Set the current hour.
    114    */
    115   public void setCurrentDay(Integer currentDay) {
    116     mCurrentDay = currentDay;
    117     updateDayDisplay();
    118   }
    119 
    120   /**
    121    * Returns the current hour.
    122    */
    123   public Integer getCurrentHour() {
    124     return mCurrentHour;
    125   }
    126 
    127   /**
    128    * Set the current hour.
    129    */
    130   public void setCurrentHour(Integer currentHour) {
    131     mCurrentHour = currentHour;
    132     updateHourDisplay();
    133   }
    134 
    135   /**
    136    * Returns the current minute.
    137    */
    138   public Integer getCurrentMinute() {
    139     return mCurrentMinute;
    140   }
    141 
    142   /**
    143    * Set the current minute.
    144    */
    145   public void setCurrentMinute(Integer currentMinute) {
    146     mCurrentMinute = currentMinute;
    147     updateMinuteDisplay();
    148   }
    149 
    150   /**
    151    * Returns the current second.
    152    */
    153   public Integer getCurrentSecond() {
    154     return mCurrentSecond;
    155   }
    156 
    157   /**
    158    * Set the current minute.
    159    */
    160   public void setCurrentSecond(Integer currentSecond) {
    161     mCurrentSecond = currentSecond;
    162     updateSecondDisplay();
    163   }
    164 
    165   /**
    166    * Set the state of the spinners appropriate to the current day.
    167    */
    168   private void updateDayDisplay() {
    169     int currentDay = mCurrentDay;
    170     mDayPicker.setCurrent(currentDay);
    171   }
    172 
    173   /**
    174    * Set the state of the spinners appropriate to the current hour.
    175    */
    176   private void updateHourDisplay() {
    177     int currentHour = mCurrentHour;
    178     mHourPicker.setCurrent(currentHour);
    179   }
    180 
    181   /**
    182    * Set the state of the spinners appropriate to the current minute.
    183    */
    184   private void updateMinuteDisplay() {
    185     mMinutePicker.setCurrent(mCurrentMinute);
    186   }
    187 
    188   /**
    189    * Set the state of the spinners appropriate to the current minute.
    190    */
    191   private void updateSecondDisplay() {
    192     mSecondPicker.setCurrent(mCurrentSecond);
    193   }
    194 
    195   /**
    196    * Returns the duration in seconds.
    197    */
    198   public double getDuration() {
    199     // The text views may still have focus so clear theirs focus which will trigger the on focus
    200     // changed and any typed values to be pulled.
    201     mDayPicker.clearFocus();
    202     mHourPicker.clearFocus();
    203     mMinutePicker.clearFocus();
    204     mSecondPicker.clearFocus();
    205     return (((((mCurrentDay * 24l + mCurrentHour) * 60) + mCurrentMinute) * 60) + mCurrentSecond);
    206   }
    207 
    208   /**
    209    * Sets the duration in milliseconds.
    210    *
    211    * @return
    212    */
    213   public void setDuration(long duration) {
    214     double seconds = duration / 1000;
    215     double minutes = seconds / 60;
    216     seconds = seconds % 60;
    217     double hours = minutes / 60;
    218     minutes = minutes % 60;
    219     double days = hours / 24;
    220     hours = hours % 24;
    221 
    222     setCurrentDay((int) days);
    223     setCurrentHour((int) hours);
    224     setCurrentMinute((int) minutes);
    225     setCurrentSecond((int) seconds);
    226   }
    227 }
    228