19f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li/*
29f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * Copyright (C) 2007 The Android Open Source Project
39f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li *
49f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * Licensed under the Apache License, Version 2.0 (the "License");
59f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * you may not use this file except in compliance with the License.
69f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * You may obtain a copy of the License at
79f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li *
89f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li *      http://www.apache.org/licenses/LICENSE-2.0
99f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li *
109f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * Unless required by applicable law or agreed to in writing, software
119f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * distributed under the License is distributed on an "AS IS" BASIS,
129f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * See the License for the specific language governing permissions and
149f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * limitations under the License.
159f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li */
169f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
179f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Lipackage com.googlecode.android_scripting.widget;
189f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
199f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.content.Context;
209f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.util.AttributeSet;
219f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.view.LayoutInflater;
229f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport android.widget.FrameLayout;
239f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
249f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Liimport com.googlecode.android_scripting.R;
259f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
269f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li/**
279f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li * A view for selecting the a duration using days, hours, minutes, and seconds.
289f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li */
299f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Lipublic class DurationPicker extends FrameLayout {
309f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
319f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private int mCurrentDay = 0; // 0-99
329f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private int mCurrentHour = 0; // 0-23
339f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private int mCurrentMinute = 0; // 0-59
349f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private int mCurrentSecond = 0; // 0-59
359f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
369f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private final NumberPicker mDayPicker;
379f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private final NumberPicker mHourPicker;
389f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private final NumberPicker mMinutePicker;
399f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private final NumberPicker mSecondPicker;
409f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
419f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public DurationPicker(Context context) {
429f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    this(context, null);
439f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
449f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
459f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public DurationPicker(Context context, AttributeSet attrs) {
469f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    this(context, attrs, 0);
479f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
489f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
499f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public DurationPicker(Context context, AttributeSet attrs, int defStyle) {
509f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    super(context, attrs, defStyle);
519f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    LayoutInflater inflater =
529f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
539f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    inflater.inflate(R.layout.duration_picker, this, true);
549f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
559f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mDayPicker = (NumberPicker) findViewById(R.id.day);
569f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mDayPicker.setRange(0, 99);
579f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mDayPicker.setSpeed(100);
589f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    // mHourPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
599f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mDayPicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
609f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
619f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        mCurrentDay = newVal;
629f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      }
639f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    });
649f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
659f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mHourPicker = (NumberPicker) findViewById(R.id.hour);
669f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mHourPicker.setRange(0, 23);
679f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mHourPicker.setSpeed(100);
689f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    // mHourPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
699f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mHourPicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
709f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
719f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        mCurrentHour = newVal;
729f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      }
739f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    });
749f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
759f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mMinutePicker = (NumberPicker) findViewById(R.id.minute);
769f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mMinutePicker.setRange(0, 59);
779f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mMinutePicker.setSpeed(100);
789f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mMinutePicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
799f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mMinutePicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
809f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
819f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        mCurrentMinute = newVal;
829f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      }
839f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    });
849f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
859f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mSecondPicker = (NumberPicker) findViewById(R.id.second);
869f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mSecondPicker.setRange(0, 59);
879f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mSecondPicker.setSpeed(100);
889f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mSecondPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
899f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mSecondPicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
909f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
919f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li        mCurrentSecond = newVal;
929f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li      }
939f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    });
949f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
959f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
969f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  @Override
979f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public void setEnabled(boolean enabled) {
989f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    super.setEnabled(enabled);
999f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mDayPicker.setEnabled(enabled);
1009f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mHourPicker.setEnabled(enabled);
1019f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mMinutePicker.setEnabled(enabled);
1029f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mSecondPicker.setEnabled(enabled);
1039f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1049f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1059f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  /**
1069f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   * Returns the current day.
1079f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   */
1089f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public Integer getCurrentDay() {
1099f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    return mCurrentDay;
1109f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1119f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1129f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  /**
1139f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   * Set the current hour.
1149f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   */
1159f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public void setCurrentDay(Integer currentDay) {
1169f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mCurrentDay = currentDay;
1179f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    updateDayDisplay();
1189f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1199f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1209f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  /**
1219f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   * Returns the current hour.
1229f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   */
1239f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public Integer getCurrentHour() {
1249f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    return mCurrentHour;
1259f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1269f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1279f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  /**
1289f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   * Set the current hour.
1299f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   */
1309f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public void setCurrentHour(Integer currentHour) {
1319f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mCurrentHour = currentHour;
1329f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    updateHourDisplay();
1339f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1349f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1359f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  /**
1369f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   * Returns the current minute.
1379f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   */
1389f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public Integer getCurrentMinute() {
1399f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    return mCurrentMinute;
1409f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1419f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1429f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  /**
1439f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   * Set the current minute.
1449f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   */
1459f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public void setCurrentMinute(Integer currentMinute) {
1469f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mCurrentMinute = currentMinute;
1479f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    updateMinuteDisplay();
1489f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1499f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1509f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  /**
1519f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   * Returns the current second.
1529f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   */
1539f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public Integer getCurrentSecond() {
1549f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    return mCurrentSecond;
1559f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1569f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1579f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  /**
1589f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   * Set the current minute.
1599f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   */
1609f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public void setCurrentSecond(Integer currentSecond) {
1619f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mCurrentSecond = currentSecond;
1629f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    updateSecondDisplay();
1639f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1649f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1659f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  /**
1669f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   * Set the state of the spinners appropriate to the current day.
1679f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   */
1689f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private void updateDayDisplay() {
1699f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    int currentDay = mCurrentDay;
1709f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mDayPicker.setCurrent(currentDay);
1719f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1729f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1739f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  /**
1749f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   * Set the state of the spinners appropriate to the current hour.
1759f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   */
1769f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private void updateHourDisplay() {
1779f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    int currentHour = mCurrentHour;
1789f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mHourPicker.setCurrent(currentHour);
1799f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1809f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1819f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  /**
1829f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   * Set the state of the spinners appropriate to the current minute.
1839f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   */
1849f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private void updateMinuteDisplay() {
1859f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mMinutePicker.setCurrent(mCurrentMinute);
1869f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1879f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1889f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  /**
1899f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   * Set the state of the spinners appropriate to the current minute.
1909f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   */
1919f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  private void updateSecondDisplay() {
1929f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mSecondPicker.setCurrent(mCurrentSecond);
1939f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
1949f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
1959f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  /**
1969f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   * Returns the duration in seconds.
1979f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   */
1989f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public double getDuration() {
1999f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    // The text views may still have focus so clear theirs focus which will trigger the on focus
2009f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    // changed and any typed values to be pulled.
2019f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mDayPicker.clearFocus();
2029f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mHourPicker.clearFocus();
2039f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mMinutePicker.clearFocus();
2049f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    mSecondPicker.clearFocus();
2059f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    return (((((mCurrentDay * 24l + mCurrentHour) * 60) + mCurrentMinute) * 60) + mCurrentSecond);
2069f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
2079f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
2089f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  /**
2099f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   * Sets the duration in milliseconds.
2109f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   *
2119f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   * @return
2129f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li   */
2139f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  public void setDuration(long duration) {
2149f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    double seconds = duration / 1000;
2159f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    double minutes = seconds / 60;
2169f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    seconds = seconds % 60;
2179f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    double hours = minutes / 60;
2189f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    minutes = minutes % 60;
2199f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    double days = hours / 24;
2209f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    hours = hours % 24;
2219f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li
2229f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    setCurrentDay((int) days);
2239f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    setCurrentHour((int) hours);
2249f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    setCurrentMinute((int) minutes);
2259f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li    setCurrentSecond((int) seconds);
2269f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li  }
2279f32db87b486c93a0ea71eb1781ee45676b8bf8bXin Li}
228