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