| /* |
| * Copyright (C) 2007 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.googlecode.android_scripting.widget; |
| |
| import android.content.Context; |
| import android.util.AttributeSet; |
| import android.view.LayoutInflater; |
| import android.widget.FrameLayout; |
| |
| import com.googlecode.android_scripting.R; |
| |
| /** |
| * A view for selecting the a duration using days, hours, minutes, and seconds. |
| */ |
| public class DurationPicker extends FrameLayout { |
| |
| private int mCurrentDay = 0; // 0-99 |
| private int mCurrentHour = 0; // 0-23 |
| private int mCurrentMinute = 0; // 0-59 |
| private int mCurrentSecond = 0; // 0-59 |
| |
| private final NumberPicker mDayPicker; |
| private final NumberPicker mHourPicker; |
| private final NumberPicker mMinutePicker; |
| private final NumberPicker mSecondPicker; |
| |
| public DurationPicker(Context context) { |
| this(context, null); |
| } |
| |
| public DurationPicker(Context context, AttributeSet attrs) { |
| this(context, attrs, 0); |
| } |
| |
| public DurationPicker(Context context, AttributeSet attrs, int defStyle) { |
| super(context, attrs, defStyle); |
| LayoutInflater inflater = |
| (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); |
| inflater.inflate(R.layout.duration_picker, this, true); |
| |
| mDayPicker = (NumberPicker) findViewById(R.id.day); |
| mDayPicker.setRange(0, 99); |
| mDayPicker.setSpeed(100); |
| // mHourPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); |
| mDayPicker.setOnChangeListener(new NumberPicker.OnChangedListener() { |
| public void onChanged(NumberPicker spinner, int oldVal, int newVal) { |
| mCurrentDay = newVal; |
| } |
| }); |
| |
| mHourPicker = (NumberPicker) findViewById(R.id.hour); |
| mHourPicker.setRange(0, 23); |
| mHourPicker.setSpeed(100); |
| // mHourPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); |
| mHourPicker.setOnChangeListener(new NumberPicker.OnChangedListener() { |
| public void onChanged(NumberPicker spinner, int oldVal, int newVal) { |
| mCurrentHour = newVal; |
| } |
| }); |
| |
| mMinutePicker = (NumberPicker) findViewById(R.id.minute); |
| mMinutePicker.setRange(0, 59); |
| mMinutePicker.setSpeed(100); |
| mMinutePicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); |
| mMinutePicker.setOnChangeListener(new NumberPicker.OnChangedListener() { |
| public void onChanged(NumberPicker spinner, int oldVal, int newVal) { |
| mCurrentMinute = newVal; |
| } |
| }); |
| |
| mSecondPicker = (NumberPicker) findViewById(R.id.second); |
| mSecondPicker.setRange(0, 59); |
| mSecondPicker.setSpeed(100); |
| mSecondPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); |
| mSecondPicker.setOnChangeListener(new NumberPicker.OnChangedListener() { |
| public void onChanged(NumberPicker spinner, int oldVal, int newVal) { |
| mCurrentSecond = newVal; |
| } |
| }); |
| } |
| |
| @Override |
| public void setEnabled(boolean enabled) { |
| super.setEnabled(enabled); |
| mDayPicker.setEnabled(enabled); |
| mHourPicker.setEnabled(enabled); |
| mMinutePicker.setEnabled(enabled); |
| mSecondPicker.setEnabled(enabled); |
| } |
| |
| /** |
| * Returns the current day. |
| */ |
| public Integer getCurrentDay() { |
| return mCurrentDay; |
| } |
| |
| /** |
| * Set the current hour. |
| */ |
| public void setCurrentDay(Integer currentDay) { |
| mCurrentDay = currentDay; |
| updateDayDisplay(); |
| } |
| |
| /** |
| * Returns the current hour. |
| */ |
| public Integer getCurrentHour() { |
| return mCurrentHour; |
| } |
| |
| /** |
| * Set the current hour. |
| */ |
| public void setCurrentHour(Integer currentHour) { |
| mCurrentHour = currentHour; |
| updateHourDisplay(); |
| } |
| |
| /** |
| * Returns the current minute. |
| */ |
| public Integer getCurrentMinute() { |
| return mCurrentMinute; |
| } |
| |
| /** |
| * Set the current minute. |
| */ |
| public void setCurrentMinute(Integer currentMinute) { |
| mCurrentMinute = currentMinute; |
| updateMinuteDisplay(); |
| } |
| |
| /** |
| * Returns the current second. |
| */ |
| public Integer getCurrentSecond() { |
| return mCurrentSecond; |
| } |
| |
| /** |
| * Set the current minute. |
| */ |
| public void setCurrentSecond(Integer currentSecond) { |
| mCurrentSecond = currentSecond; |
| updateSecondDisplay(); |
| } |
| |
| /** |
| * Set the state of the spinners appropriate to the current day. |
| */ |
| private void updateDayDisplay() { |
| int currentDay = mCurrentDay; |
| mDayPicker.setCurrent(currentDay); |
| } |
| |
| /** |
| * Set the state of the spinners appropriate to the current hour. |
| */ |
| private void updateHourDisplay() { |
| int currentHour = mCurrentHour; |
| mHourPicker.setCurrent(currentHour); |
| } |
| |
| /** |
| * Set the state of the spinners appropriate to the current minute. |
| */ |
| private void updateMinuteDisplay() { |
| mMinutePicker.setCurrent(mCurrentMinute); |
| } |
| |
| /** |
| * Set the state of the spinners appropriate to the current minute. |
| */ |
| private void updateSecondDisplay() { |
| mSecondPicker.setCurrent(mCurrentSecond); |
| } |
| |
| /** |
| * Returns the duration in seconds. |
| */ |
| public double getDuration() { |
| // The text views may still have focus so clear theirs focus which will trigger the on focus |
| // changed and any typed values to be pulled. |
| mDayPicker.clearFocus(); |
| mHourPicker.clearFocus(); |
| mMinutePicker.clearFocus(); |
| mSecondPicker.clearFocus(); |
| return (((((mCurrentDay * 24l + mCurrentHour) * 60) + mCurrentMinute) * 60) + mCurrentSecond); |
| } |
| |
| /** |
| * Sets the duration in milliseconds. |
| * |
| * @return |
| */ |
| public void setDuration(long duration) { |
| double seconds = duration / 1000; |
| double minutes = seconds / 60; |
| seconds = seconds % 60; |
| double hours = minutes / 60; |
| minutes = minutes % 60; |
| double days = hours / 24; |
| hours = hours % 24; |
| |
| setCurrentDay((int) days); |
| setCurrentHour((int) hours); |
| setCurrentMinute((int) minutes); |
| setCurrentSecond((int) seconds); |
| } |
| } |