/*
* 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 org.kazzz.view.dialog;
import java.util.Calendar;
import org.kazzz.R;
import org.kazzz.view.numberpicker.NumberPicker;
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.widget.FrameLayout;
/**
* android SDK
*
* @author Kazzz.
* @since JDK1.5 Android Level 4
*
*/
public class TimePickerEx extends FrameLayout {
private static final String TAG = "TimePickerEx";
/**
*
*
*/
private static final OnTimeChangedListener NO_OP_CHANGE_LISTENER =
new OnTimeChangedListener() {
public void onTimeChanged(TimePickerEx view, int hourOfDay, int minute) {
}
};
private int currentHour = 0; // 0-23
private int currentMinute = 0; // 0-59
// ui components
private final NumberPicker hourPicker;
private final NumberPicker minutePicker;
// callbacks
private OnTimeChangedListener onTimeChangedListener;
/**
*
*/
public interface OnTimeChangedListener {
/**
* @param view
* @param hourOfDay
* @param minute
*/
void onTimeChanged(TimePickerEx view, int hourOfDay, int minute);
}
/**
*
* @param context (Activity)
*/
public TimePickerEx(Context context) {
this(context, null);
}
/**
*
* @param context (Activity)
* @param attrs XML
*/
public TimePickerEx(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
/**
*
* @param context (Activity)
* @param attrs XML
* @param defStyle
*/
public TimePickerEx(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
LayoutInflater inflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.hour_minute_pair, this, // we are the parent
true);
//
this.hourPicker = (NumberPicker) findViewById(R.id.pickerHour);
this.hourPicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
currentHour = newVal;
onTimeChanged();
}
});
//
this.minutePicker = (NumberPicker) findViewById(R.id.pickerMinute);
this.minutePicker.setRange(0, 59);
this.minutePicker.setSpeed(100);
this.minutePicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
this.minutePicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
public void onChanged(NumberPicker spinner, int oldVal, int newVal) {
currentMinute = newVal;
onTimeChanged();
}
});
//
this.configurePickerRanges();
//
Calendar cal = Calendar.getInstance();
this.setOnTimeChangedListener(NO_OP_CHANGE_LISTENER);
//24H
this.setCurrentHour(cal.get(Calendar.HOUR));
this.setCurrentMinute(cal.get(Calendar.MINUTE));
if (!this.isEnabled()) {
this.setEnabled(false);
}
}
/**
* hourPicker
* @return NumberPicker hourPicker
*/
public NumberPicker getHourPicker() {
return this.hourPicker;
}
/**
* minutePicker
* @return NumberPicker minutePicker
*/
public NumberPicker getMinutePicker() {
return this.minutePicker;
}
/* (non-Javadoc)
* @see android.view.View#setEnabled(boolean)
*/
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
this.minutePicker.setEnabled(enabled);
this.hourPicker.setEnabled(enabled);
}
/**
* /
*/
private static class SavedState extends BaseSavedState {
private final int hour;
private final int minute;
/**
*
* @param superState Parcelable
* @param hour
* @param minute
*/
private SavedState(Parcelable superState, int hour, int minute) {
super(superState);
this.hour = hour;
this.minute = minute;
}
/**
*
* @param in Parcel
*/
private SavedState(Parcel in) {
super(in);
this.hour = in.readInt();
this.minute = in.readInt();
}
/**
*
* @return int
*/
public int getHour() {
return this.hour;
}
/**
*
* @return int
*/
public int getMinute() {
return this.minute;
}
/* (non-Javadoc)
* @see android.view.AbsSavedState#writeToParcel(android.os.Parcel, int)
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(this.hour);
dest.writeInt(this.minute);
}
/**
* CREATE
*/
@SuppressWarnings("unused")
public static final Parcelable.Creator<SavedState> CREATOR
= new Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
/* (non-Javadoc)
* @see android.view.View#onSaveInstanceState()
*/
@Override
protected Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
return new SavedState(superState, this.currentHour, this.currentMinute);
}
/* (non-Javadoc)
* @see android.view.View#onRestoreInstanceState(android.os.Parcelable)
*/
@Override
protected void onRestoreInstanceState(Parcelable state) {
SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
this.setCurrentHour(ss.getHour());
this.setCurrentMinute(ss.getMinute());
}
/**
*
* @param onTimeChangedListener
*/
public void setOnTimeChangedListener(OnTimeChangedListener onTimeChangedListener) {
this.onTimeChangedListener = onTimeChangedListener;
}
/**
* (0-23)
* @return Integer
*/
public Integer getCurrentHour() {
return this.currentHour;
}
/**
*
* @param currentHour
*/
public void setCurrentHour(Integer currentHour) {
Log.d(TAG, "++ setCurrentHour : " + currentHour + " ++ " );
this.currentHour = currentHour;
this.updateHourDisplay();
}
/**
*
* @return Integer
*/
public Integer getCurrentMinute() {
return this.currentMinute;
}
/**
*
* @param currentMiunte
*/
public void setCurrentMinute(Integer currentMinute) {
Log.d(TAG, "++ setCurrentMinute : " + currentMinute + " ++ " );
this.currentMinute = currentMinute;
this.updateMinuteDisplay();
}
/* (non-Javadoc)
* @see android.view.View#getBaseline()
*/
@Override
public int getBaseline() {
return hourPicker.getBaseline();
}
/**
*
*/
private void updateHourDisplay() {
int currentHour = this.currentHour;
this.hourPicker.setCurrent(currentHour);
this.hourPicker.invalidate();
this.onTimeChanged();
}
/**
*
*/
private void configurePickerRanges() {
this.hourPicker.setRange(0, 23);
this.hourPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
}
/**
*
*/
private void onTimeChanged() {
this.onTimeChangedListener.onTimeChanged(this
, this.getCurrentHour(), this.getCurrentMinute());
}
/**
*
*/
private void updateMinuteDisplay() {
int currentMin = this.currentMinute;
this.minutePicker.setCurrent(currentMin);
this.minutePicker.invalidate();
this.onTimeChanged();
}
}
|