Fix date and time picker styling
Removes done buttons from widgets, fixes date picker day selection, fixes dialog layouts in landscape, updates colors. Adds API on AlertDialog for setting the view by resource ID, which is necessary to correctly inflate the view against the dialog's parent view. BUG: 16941550 BUG: 16852521 BUG: 16878697 BUG: 16838659 BUG: 17047435 Change-Id: I138858ce06cd4abf68a2c3361ec170370236b33b
This commit is contained in:
@@ -24,8 +24,10 @@ import android.text.format.DateUtils;
|
||||
import android.util.TypedValue;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.DatePicker;
|
||||
import android.widget.DatePicker.OnDateChangedListener;
|
||||
import android.widget.DatePicker.ValidationCallback;
|
||||
|
||||
import com.android.internal.R;
|
||||
|
||||
@@ -49,7 +51,6 @@ public class DatePickerDialog extends AlertDialog implements OnClickListener,
|
||||
private final Calendar mCalendar;
|
||||
|
||||
private boolean mTitleNeedsUpdate = true;
|
||||
private boolean mIsCanceled = false;
|
||||
|
||||
/**
|
||||
* The callback used to indicate the user is done filling in the date.
|
||||
@@ -83,7 +84,7 @@ public class DatePickerDialog extends AlertDialog implements OnClickListener,
|
||||
|
||||
static int resolveDialogTheme(Context context, int resid) {
|
||||
if (resid == 0) {
|
||||
TypedValue outValue = new TypedValue();
|
||||
final TypedValue outValue = new TypedValue();
|
||||
context.getTheme().resolveAttribute(R.attr.datePickerDialogTheme, outValue, true);
|
||||
return outValue.resourceId;
|
||||
} else {
|
||||
@@ -99,68 +100,41 @@ public class DatePickerDialog extends AlertDialog implements OnClickListener,
|
||||
* @param monthOfYear The initial month of the dialog.
|
||||
* @param dayOfMonth The initial day of the dialog.
|
||||
*/
|
||||
public DatePickerDialog(Context context,
|
||||
int theme,
|
||||
OnDateSetListener listener,
|
||||
int year,
|
||||
int monthOfYear,
|
||||
int dayOfMonth) {
|
||||
public DatePickerDialog(Context context, int theme, OnDateSetListener listener, int year,
|
||||
int monthOfYear, int dayOfMonth) {
|
||||
super(context, resolveDialogTheme(context, theme));
|
||||
|
||||
mDateSetListener = listener;
|
||||
mCalendar = Calendar.getInstance();
|
||||
|
||||
Context themeContext = getContext();
|
||||
|
||||
final LayoutInflater inflater = (LayoutInflater) themeContext.getSystemService(
|
||||
Context.LAYOUT_INFLATER_SERVICE);
|
||||
final Context themeContext = getContext();
|
||||
final LayoutInflater inflater = LayoutInflater.from(themeContext);
|
||||
final View view = inflater.inflate(R.layout.date_picker_dialog, null);
|
||||
setView(view);
|
||||
setButton(BUTTON_POSITIVE, themeContext.getString(R.string.ok), this);
|
||||
setButton(BUTTON_NEGATIVE, themeContext.getString(R.string.cancel), this);
|
||||
setButtonPanelLayoutHint(LAYOUT_HINT_SIDE);
|
||||
|
||||
// Initialize state
|
||||
mDatePicker = (DatePicker) view.findViewById(R.id.datePicker);
|
||||
mDatePicker.setShowDoneButton(true);
|
||||
mDatePicker.setDismissCallback(new DatePicker.DatePickerDismissCallback() {
|
||||
@Override
|
||||
public void dismiss(DatePicker view, boolean isCancel, int year, int month, int dayOfMonth) {
|
||||
mIsCanceled = isCancel;
|
||||
if (!isCancel) {
|
||||
mDateSetListener.onDateSet(view, year, month, dayOfMonth);
|
||||
}
|
||||
DatePickerDialog.this.dismiss();
|
||||
}
|
||||
});
|
||||
mDatePicker.init(year, monthOfYear, dayOfMonth, this);
|
||||
}
|
||||
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
tryNotifyDateSet();
|
||||
mDatePicker.setValidationCallback(mValidationCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancel() {
|
||||
mIsCanceled = true;
|
||||
super.cancel();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
tryNotifyDateSet();
|
||||
super.onStop();
|
||||
}
|
||||
|
||||
public void onDateChanged(DatePicker view, int year,
|
||||
int month, int day) {
|
||||
public void onDateChanged(DatePicker view, int year, int month, int day) {
|
||||
mDatePicker.init(year, month, day, this);
|
||||
updateTitle(year, month, day);
|
||||
}
|
||||
|
||||
private void tryNotifyDateSet() {
|
||||
if (mDateSetListener != null && !mIsCanceled) {
|
||||
mDatePicker.clearFocus();
|
||||
mDateSetListener.onDateSet(mDatePicker, mDatePicker.getYear(),
|
||||
mDatePicker.getMonth(), mDatePicker.getDayOfMonth());
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
switch (which) {
|
||||
case BUTTON_POSITIVE:
|
||||
if (mDateSetListener != null) {
|
||||
mDateSetListener.onDateSet(mDatePicker, mDatePicker.getYear(),
|
||||
mDatePicker.getMonth(), mDatePicker.getDayOfMonth());
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -208,7 +182,7 @@ public class DatePickerDialog extends AlertDialog implements OnClickListener,
|
||||
|
||||
@Override
|
||||
public Bundle onSaveInstanceState() {
|
||||
Bundle state = super.onSaveInstanceState();
|
||||
final Bundle state = super.onSaveInstanceState();
|
||||
state.putInt(YEAR, mDatePicker.getYear());
|
||||
state.putInt(MONTH, mDatePicker.getMonth());
|
||||
state.putInt(DAY, mDatePicker.getDayOfMonth());
|
||||
@@ -218,9 +192,19 @@ public class DatePickerDialog extends AlertDialog implements OnClickListener,
|
||||
@Override
|
||||
public void onRestoreInstanceState(Bundle savedInstanceState) {
|
||||
super.onRestoreInstanceState(savedInstanceState);
|
||||
int year = savedInstanceState.getInt(YEAR);
|
||||
int month = savedInstanceState.getInt(MONTH);
|
||||
int day = savedInstanceState.getInt(DAY);
|
||||
final int year = savedInstanceState.getInt(YEAR);
|
||||
final int month = savedInstanceState.getInt(MONTH);
|
||||
final int day = savedInstanceState.getInt(DAY);
|
||||
mDatePicker.init(year, month, day, this);
|
||||
}
|
||||
|
||||
private final ValidationCallback mValidationCallback = new ValidationCallback() {
|
||||
@Override
|
||||
public void onValidationChanged(boolean valid) {
|
||||
final Button positive = getButton(BUTTON_POSITIVE);
|
||||
if (positive != null) {
|
||||
positive.setEnabled(valid);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -19,13 +19,14 @@ package android.app;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.DialogInterface.OnClickListener;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.util.TypedValue;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.TimePicker;
|
||||
import android.widget.TimePicker.OnTimeChangedListener;
|
||||
import android.widget.TimePicker.ValidationCallback;
|
||||
|
||||
import com.android.internal.R;
|
||||
|
||||
@@ -35,8 +36,19 @@ import com.android.internal.R;
|
||||
* <p>See the <a href="{@docRoot}guide/topics/ui/controls/pickers.html">Pickers</a>
|
||||
* guide.</p>
|
||||
*/
|
||||
public class TimePickerDialog extends AlertDialog
|
||||
implements OnClickListener, OnTimeChangedListener {
|
||||
public class TimePickerDialog extends AlertDialog implements OnClickListener,
|
||||
OnTimeChangedListener {
|
||||
|
||||
private static final String HOUR = "hour";
|
||||
private static final String MINUTE = "minute";
|
||||
private static final String IS_24_HOUR = "is24hour";
|
||||
|
||||
private final TimePicker mTimePicker;
|
||||
private final OnTimeSetListener mTimeSetCallback;
|
||||
|
||||
private final int mInitialHourOfDay;
|
||||
private final int mInitialMinute;
|
||||
private final boolean mIs24HourView;
|
||||
|
||||
/**
|
||||
* The callback interface used to indicate the user is done filling in
|
||||
@@ -52,19 +64,6 @@ public class TimePickerDialog extends AlertDialog
|
||||
void onTimeSet(TimePicker view, int hourOfDay, int minute);
|
||||
}
|
||||
|
||||
private static final String HOUR = "hour";
|
||||
private static final String MINUTE = "minute";
|
||||
private static final String IS_24_HOUR = "is24hour";
|
||||
|
||||
private final TimePicker mTimePicker;
|
||||
private final OnTimeSetListener mTimeSetCallback;
|
||||
|
||||
int mInitialHourOfDay;
|
||||
int mInitialMinute;
|
||||
boolean mIs24HourView;
|
||||
|
||||
private boolean mIsCanceled;
|
||||
|
||||
/**
|
||||
* @param context Parent.
|
||||
* @param callBack How parent is notified.
|
||||
@@ -80,7 +79,7 @@ public class TimePickerDialog extends AlertDialog
|
||||
|
||||
static int resolveDialogTheme(Context context, int resid) {
|
||||
if (resid == 0) {
|
||||
TypedValue outValue = new TypedValue();
|
||||
final TypedValue outValue = new TypedValue();
|
||||
context.getTheme().resolveAttribute(R.attr.timePickerDialogTheme, outValue, true);
|
||||
return outValue.resourceId;
|
||||
} else {
|
||||
@@ -96,10 +95,8 @@ public class TimePickerDialog extends AlertDialog
|
||||
* @param minute The initial minute.
|
||||
* @param is24HourView Whether this is a 24 hour view, or AM/PM.
|
||||
*/
|
||||
public TimePickerDialog(Context context,
|
||||
int theme,
|
||||
OnTimeSetListener callBack,
|
||||
int hourOfDay, int minute, boolean is24HourView) {
|
||||
public TimePickerDialog(Context context, int theme, OnTimeSetListener callBack, int hourOfDay,
|
||||
int minute, boolean is24HourView) {
|
||||
super(context, resolveDialogTheme(context, theme));
|
||||
|
||||
mTimeSetCallback = callBack;
|
||||
@@ -108,72 +105,51 @@ public class TimePickerDialog extends AlertDialog
|
||||
mIs24HourView = is24HourView;
|
||||
|
||||
final Context themeContext = getContext();
|
||||
|
||||
final int targetSdkVersion = themeContext.getApplicationInfo().targetSdkVersion;
|
||||
if (targetSdkVersion < Build.VERSION_CODES.L) {
|
||||
setIcon(0);
|
||||
setTitle(R.string.time_picker_dialog_title);
|
||||
}
|
||||
|
||||
final LayoutInflater inflater = LayoutInflater.from(themeContext);
|
||||
final View view = inflater.inflate(R.layout.time_picker_dialog, null);
|
||||
setView(view);
|
||||
setButton(BUTTON_POSITIVE, themeContext.getString(R.string.ok), this);
|
||||
setButton(BUTTON_NEGATIVE, themeContext.getString(R.string.cancel), this);
|
||||
|
||||
mTimePicker = (TimePicker) view.findViewById(R.id.timePicker);
|
||||
mTimePicker.setShowDoneButton(true);
|
||||
// If time picker layout has no done button, add a dialog button.
|
||||
if (!mTimePicker.isShowDoneButton()) {
|
||||
setButton(BUTTON_POSITIVE, themeContext.getText(R.string.date_time_done), this);
|
||||
}
|
||||
|
||||
mTimePicker.setDismissCallback(new TimePicker.TimePickerDismissCallback() {
|
||||
@Override
|
||||
public void dismiss(TimePicker view, boolean isCancel, int hourOfDay, int minute) {
|
||||
mIsCanceled = isCancel;
|
||||
if (!isCancel) {
|
||||
mTimeSetCallback.onTimeSet(view, hourOfDay, minute);
|
||||
TimePickerDialog.this.dismiss();
|
||||
} else {
|
||||
TimePickerDialog.this.cancel();
|
||||
}
|
||||
}
|
||||
});
|
||||
mTimePicker.setIs24HourView(mIs24HourView);
|
||||
mTimePicker.setCurrentHour(mInitialHourOfDay);
|
||||
mTimePicker.setCurrentMinute(mInitialMinute);
|
||||
mTimePicker.setOnTimeChangedListener(this);
|
||||
mTimePicker.setValidationCallback(mValidationCallback);
|
||||
}
|
||||
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
tryNotifyTimeSet();
|
||||
}
|
||||
|
||||
public void updateTime(int hourOfDay, int minutOfHour) {
|
||||
mTimePicker.setCurrentHour(hourOfDay);
|
||||
mTimePicker.setCurrentMinute(minutOfHour);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
|
||||
/* do nothing */
|
||||
}
|
||||
|
||||
private void tryNotifyTimeSet() {
|
||||
if (mTimeSetCallback != null && !mIsCanceled) {
|
||||
mTimePicker.clearFocus();
|
||||
mTimeSetCallback.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(),
|
||||
mTimePicker.getCurrentMinute());
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
switch (which) {
|
||||
case BUTTON_POSITIVE:
|
||||
if (mTimeSetCallback != null) {
|
||||
mTimeSetCallback.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(),
|
||||
mTimePicker.getCurrentMinute());
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
tryNotifyTimeSet();
|
||||
super.onStop();
|
||||
/**
|
||||
* Sets the current time.
|
||||
*
|
||||
* @param hourOfDay The current hour within the day.
|
||||
* @param minuteOfHour The current minute within the hour.
|
||||
*/
|
||||
public void updateTime(int hourOfDay, int minuteOfHour) {
|
||||
mTimePicker.setCurrentHour(hourOfDay);
|
||||
mTimePicker.setCurrentMinute(minuteOfHour);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Bundle onSaveInstanceState() {
|
||||
Bundle state = super.onSaveInstanceState();
|
||||
final Bundle state = super.onSaveInstanceState();
|
||||
state.putInt(HOUR, mTimePicker.getCurrentHour());
|
||||
state.putInt(MINUTE, mTimePicker.getCurrentMinute());
|
||||
state.putBoolean(IS_24_HOUR, mTimePicker.is24HourView());
|
||||
@@ -183,10 +159,20 @@ public class TimePickerDialog extends AlertDialog
|
||||
@Override
|
||||
public void onRestoreInstanceState(Bundle savedInstanceState) {
|
||||
super.onRestoreInstanceState(savedInstanceState);
|
||||
int hour = savedInstanceState.getInt(HOUR);
|
||||
int minute = savedInstanceState.getInt(MINUTE);
|
||||
final int hour = savedInstanceState.getInt(HOUR);
|
||||
final int minute = savedInstanceState.getInt(MINUTE);
|
||||
mTimePicker.setIs24HourView(savedInstanceState.getBoolean(IS_24_HOUR));
|
||||
mTimePicker.setCurrentHour(hour);
|
||||
mTimePicker.setCurrentMinute(minute);
|
||||
}
|
||||
|
||||
private final ValidationCallback mValidationCallback = new ValidationCallback() {
|
||||
@Override
|
||||
public void onValidationChanged(boolean valid) {
|
||||
final Button positive = getButton(BUTTON_POSITIVE);
|
||||
if (positive != null) {
|
||||
positive.setEnabled(valid);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package android.widget;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.annotation.Widget;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
@@ -123,7 +124,7 @@ public class DatePicker extends FrameLayout {
|
||||
|
||||
final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DatePicker,
|
||||
defStyleAttr, defStyleRes);
|
||||
int mode = a.getInt(R.styleable.DatePicker_datePickerMode, MODE_SPINNER);
|
||||
final int mode = a.getInt(R.styleable.DatePicker_datePickerMode, MODE_SPINNER);
|
||||
a.recycle();
|
||||
|
||||
switch (mode) {
|
||||
@@ -148,20 +149,6 @@ public class DatePicker extends FrameLayout {
|
||||
defStyleRes);
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
public void setShowDoneButton(boolean showDoneButton) {
|
||||
mDelegate.setShowDoneButton(showDoneButton);
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
public void setDismissCallback(DatePickerDismissCallback callback) {
|
||||
mDelegate.setDismissCallback(callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the state. If the provided values designate an inconsistent
|
||||
* date the values are normalized before updating the spinners.
|
||||
@@ -259,6 +246,16 @@ public class DatePicker extends FrameLayout {
|
||||
mDelegate.setMaxDate(maxDate);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the callback that indicates the current date is valid.
|
||||
*
|
||||
* @param callback the callback, may be null
|
||||
* @hide
|
||||
*/
|
||||
public void setValidationCallback(@Nullable ValidationCallback callback) {
|
||||
mDelegate.setValidationCallback(callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEnabled(boolean enabled) {
|
||||
if (mDelegate.isEnabled() == enabled) {
|
||||
@@ -402,8 +399,7 @@ public class DatePicker extends FrameLayout {
|
||||
void setSpinnersShown(boolean shown);
|
||||
boolean getSpinnersShown();
|
||||
|
||||
void setShowDoneButton(boolean showDoneButton);
|
||||
void setDismissCallback(DatePickerDismissCallback callback);
|
||||
void setValidationCallback(ValidationCallback callback);
|
||||
|
||||
void onConfigurationChanged(Configuration newConfig);
|
||||
|
||||
@@ -431,7 +427,8 @@ public class DatePicker extends FrameLayout {
|
||||
protected Locale mCurrentLocale;
|
||||
|
||||
// Callbacks
|
||||
protected OnDateChangedListener mOnDateChangedListener;
|
||||
protected OnDateChangedListener mOnDateChangedListener;
|
||||
protected ValidationCallback mValidationCallback;
|
||||
|
||||
public AbstractDatePickerDelegate(DatePicker delegator, Context context) {
|
||||
mDelegator = delegator;
|
||||
@@ -447,15 +444,27 @@ public class DatePicker extends FrameLayout {
|
||||
}
|
||||
mCurrentLocale = locale;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValidationCallback(ValidationCallback callback) {
|
||||
mValidationCallback = callback;
|
||||
}
|
||||
|
||||
protected void onValidationChanged(boolean valid) {
|
||||
if (mValidationCallback != null) {
|
||||
mValidationCallback.onValidationChanged(valid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A callback interface for dismissing the DatePicker when included into a Dialog
|
||||
* A callback interface for updating input validity when the date picker
|
||||
* when included into a dialog.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public static interface DatePickerDismissCallback {
|
||||
void dismiss(DatePicker view, boolean isCancel, int year, int month, int dayOfMonth);
|
||||
public static interface ValidationCallback {
|
||||
void onValidationChanged(boolean valid);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -774,16 +783,6 @@ public class DatePicker extends FrameLayout {
|
||||
return mSpinners.isShown();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setShowDoneButton(boolean showDoneButton) {
|
||||
// Nothing to do
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDismissCallback(DatePickerDismissCallback callback) {
|
||||
// Nothing to do
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
setCurrentLocale(newConfig.locale);
|
||||
|
||||
@@ -31,11 +31,9 @@ import android.text.format.DateFormat;
|
||||
import android.text.format.DateUtils;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.SparseArray;
|
||||
import android.util.StateSet;
|
||||
import android.view.HapticFeedbackConstants;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
import android.view.accessibility.AccessibilityNodeInfo;
|
||||
import android.view.animation.AlphaAnimation;
|
||||
@@ -83,8 +81,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
|
||||
private DayPickerView mDayPickerView;
|
||||
private YearPickerView mYearPickerView;
|
||||
|
||||
private ViewGroup mLayoutButtons;
|
||||
|
||||
private boolean mIsEnabled = true;
|
||||
|
||||
// Accessibility strings.
|
||||
@@ -106,11 +102,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
|
||||
private Calendar mMinDate;
|
||||
private Calendar mMaxDate;
|
||||
|
||||
// For showing the done button when in a Dialog
|
||||
private Button mDoneButton;
|
||||
private boolean mShowDoneButton;
|
||||
private DatePicker.DatePickerDismissCallback mDismissCallback;
|
||||
|
||||
private HashSet<OnDateChangedListener> mListeners = new HashSet<OnDateChangedListener>();
|
||||
|
||||
public DatePickerCalendarDelegate(DatePicker delegator, Context context, AttributeSet attrs,
|
||||
@@ -165,7 +156,7 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
|
||||
R.styleable.DatePicker_headerSelectedTextColor, defaultHighlightColor);
|
||||
final int headerBackgroundColor = a.getColor(R.styleable.DatePicker_headerBackgroundColor,
|
||||
Color.TRANSPARENT);
|
||||
mMonthAndDayLayout.setBackgroundColor(headerBackgroundColor);
|
||||
mDateLayout.setBackgroundColor(headerBackgroundColor);
|
||||
|
||||
final int monthTextAppearanceResId = a.getResourceId(
|
||||
R.styleable.DatePicker_headerMonthTextAppearance, -1);
|
||||
@@ -221,20 +212,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
|
||||
animation2.setDuration(ANIMATION_DURATION);
|
||||
mAnimator.setOutAnimation(animation2);
|
||||
|
||||
mLayoutButtons = (ViewGroup) mainView.findViewById(R.id.layout_buttons);
|
||||
mDoneButton = (Button) mainView.findViewById(R.id.done);
|
||||
mDoneButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
tryVibrate();
|
||||
if (mDismissCallback != null) {
|
||||
mDismissCallback.dismiss(mDelegator, false, mCurrentDate.get(Calendar.YEAR),
|
||||
mCurrentDate.get(Calendar.MONTH),
|
||||
mCurrentDate.get(Calendar.DAY_OF_MONTH));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
updateDisplay(false);
|
||||
setCurrentView(MONTH_AND_DAY_VIEW);
|
||||
}
|
||||
@@ -311,9 +288,9 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
|
||||
|
||||
// Position the Year View at the correct location
|
||||
if (viewIndices[YEAR_INDEX] == 0) {
|
||||
mDateLayout.addView(mHeaderYearTextView, 0);
|
||||
} else {
|
||||
mDateLayout.addView(mHeaderYearTextView, 1);
|
||||
} else {
|
||||
mDateLayout.addView(mHeaderYearTextView, 2);
|
||||
}
|
||||
|
||||
// Position Day and Month Views
|
||||
@@ -544,21 +521,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setShowDoneButton(boolean showDoneButton) {
|
||||
mShowDoneButton = showDoneButton;
|
||||
updateDoneButtonVisibility();
|
||||
}
|
||||
|
||||
private void updateDoneButtonVisibility() {
|
||||
mLayoutButtons.setVisibility(mShowDoneButton ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDismissCallback(DatePicker.DatePickerDismissCallback callback) {
|
||||
mDismissCallback = callback;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig) {
|
||||
mYearFormat = new SimpleDateFormat("y", newConfig.locale);
|
||||
@@ -640,7 +602,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
|
||||
updatePickers();
|
||||
setCurrentView(MONTH_AND_DAY_VIEW);
|
||||
updateDisplay(true);
|
||||
updateDoneButtonEnableState();
|
||||
}
|
||||
|
||||
// If the newly selected month / year does not contain the currently selected day number,
|
||||
@@ -684,16 +645,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate i
|
||||
mCurrentDate.set(Calendar.DAY_OF_MONTH, day);
|
||||
updatePickers();
|
||||
updateDisplay(true);
|
||||
updateDoneButtonEnableState();
|
||||
}
|
||||
|
||||
private void updateDoneButtonEnableState() {
|
||||
if (mShowDoneButton) {
|
||||
final boolean enabled = mCurrentDate.equals(mMinDate) ||
|
||||
mCurrentDate.equals(mMaxDate) ||
|
||||
(mCurrentDate.after(mMinDate) && mCurrentDate.before(mMaxDate));
|
||||
mDoneButton.setEnabled(enabled);
|
||||
}
|
||||
}
|
||||
|
||||
private void updatePickers() {
|
||||
|
||||
@@ -85,7 +85,7 @@ public class RadialTimePickerView extends View implements View.OnTouchListener {
|
||||
private static final int ALPHA_TRANSPARENT = 0;
|
||||
|
||||
// Alpha level of color for selector.
|
||||
private static final int ALPHA_SELECTOR = 255; // was 51
|
||||
private static final int ALPHA_SELECTOR = 60; // was 51
|
||||
|
||||
// Alpha level of color for selected circle.
|
||||
private static final int ALPHA_AMPM_SELECTED = ALPHA_SELECTOR;
|
||||
@@ -105,7 +105,7 @@ public class RadialTimePickerView extends View implements View.OnTouchListener {
|
||||
|
||||
private static final int CENTER_RADIUS = 2;
|
||||
|
||||
private static final int[] STATE_SET_SELECTED = new int[] { R.attr.state_selected };
|
||||
private static final int[] STATE_SET_SELECTED = new int[] {R.attr.state_selected};
|
||||
|
||||
private static int[] sSnapPrefer30sMap = new int[361];
|
||||
|
||||
@@ -337,6 +337,9 @@ public class RadialTimePickerView extends View implements View.OnTouchListener {
|
||||
// list doesn't have a state for selected, we'll use this color.
|
||||
final int amPmSelectedColor = a.getColor(R.styleable.TimePicker_amPmSelectedBackgroundColor,
|
||||
res.getColor(R.color.timepicker_default_ampm_selected_background_color_material));
|
||||
amPmBackgroundColor = ColorStateList.addFirstIfMissing(
|
||||
amPmBackgroundColor, R.attr.state_selected, amPmSelectedColor);
|
||||
|
||||
mAmPmSelectedColor = amPmBackgroundColor.getColorForState(
|
||||
STATE_SET_SELECTED, amPmSelectedColor);
|
||||
mAmPmUnselectedColor = amPmBackgroundColor.getDefaultColor();
|
||||
|
||||
@@ -38,10 +38,8 @@ import android.view.accessibility.AccessibilityNodeInfo;
|
||||
import com.android.internal.R;
|
||||
import com.android.internal.widget.ExploreByTouchHelper;
|
||||
|
||||
import java.security.InvalidParameterException;
|
||||
import java.util.Calendar;
|
||||
import java.util.Formatter;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
@@ -52,8 +50,8 @@ import java.util.Locale;
|
||||
class SimpleMonthView extends View {
|
||||
private static final String TAG = "SimpleMonthView";
|
||||
|
||||
private static int DEFAULT_HEIGHT = 32;
|
||||
private static int MIN_HEIGHT = 10;
|
||||
private static final int DEFAULT_HEIGHT = 32;
|
||||
private static final int MIN_HEIGHT = 10;
|
||||
|
||||
private static final int DEFAULT_SELECTED_DAY = -1;
|
||||
private static final int DEFAULT_WEEK_START = Calendar.SUNDAY;
|
||||
@@ -63,13 +61,13 @@ class SimpleMonthView extends View {
|
||||
|
||||
private static final int SELECTED_CIRCLE_ALPHA = 60;
|
||||
|
||||
private static int DAY_SEPARATOR_WIDTH = 1;
|
||||
private static final int DAY_SEPARATOR_WIDTH = 1;
|
||||
|
||||
private int mMiniDayNumberTextSize;
|
||||
private int mMonthLabelTextSize;
|
||||
private int mMonthDayLabelTextSize;
|
||||
private int mMonthHeaderSize;
|
||||
private int mDaySelectedCircleSize;
|
||||
private final int mMiniDayNumberTextSize;
|
||||
private final int mMonthLabelTextSize;
|
||||
private final int mMonthDayLabelTextSize;
|
||||
private final int mMonthHeaderSize;
|
||||
private final int mDaySelectedCircleSize;
|
||||
|
||||
// used for scaling to the device density
|
||||
private static float mScale = 0;
|
||||
@@ -289,7 +287,7 @@ class SimpleMonthView extends View {
|
||||
drawDays(canvas);
|
||||
}
|
||||
|
||||
private static boolean isValidDay(int day) {
|
||||
private static boolean isValidDayOfWeek(int day) {
|
||||
return (day >= Time.SUNDAY && day <= Time.SATURDAY);
|
||||
}
|
||||
|
||||
@@ -299,7 +297,7 @@ class SimpleMonthView extends View {
|
||||
* default to no focus month if no value is passed in. The only required parameter is the
|
||||
* week start.
|
||||
*
|
||||
* @param selectedDay the selected day.
|
||||
* @param selectedDay the selected day of the month, or -1 for no selection.
|
||||
* @param month the month.
|
||||
* @param year the year.
|
||||
* @param weekStart which day the week should start on. {@link Time#SUNDAY} through
|
||||
@@ -313,9 +311,7 @@ class SimpleMonthView extends View {
|
||||
mRowHeight = MIN_HEIGHT;
|
||||
}
|
||||
|
||||
if (isValidDay(selectedDay)) {
|
||||
mSelectedDay = selectedDay;
|
||||
}
|
||||
mSelectedDay = selectedDay;
|
||||
|
||||
if (month >= Calendar.JANUARY && month <= Calendar.DECEMBER) {
|
||||
mMonth = month;
|
||||
@@ -333,7 +329,7 @@ class SimpleMonthView extends View {
|
||||
mCalendar.set(Calendar.DAY_OF_MONTH, 1);
|
||||
mDayOfWeekStart = mCalendar.get(Calendar.DAY_OF_WEEK);
|
||||
|
||||
if (isValidDay(weekStart)) {
|
||||
if (isValidDayOfWeek(weekStart)) {
|
||||
mWeekStart = weekStart;
|
||||
} else {
|
||||
mWeekStart = mCalendar.getFirstDayOfWeek();
|
||||
@@ -424,8 +420,8 @@ class SimpleMonthView extends View {
|
||||
}
|
||||
|
||||
private void drawMonthTitle(Canvas canvas) {
|
||||
int x = (mWidth + 2 * mPadding) / 2;
|
||||
int y = (mMonthHeaderSize - mMonthDayLabelTextSize) / 2 + (mMonthLabelTextSize / 3);
|
||||
final float x = (mWidth + 2 * mPadding) / 2f;
|
||||
final float y = (mMonthHeaderSize - mMonthDayLabelTextSize) / 2f;
|
||||
canvas.drawText(getMonthAndYearString(), x, y, mMonthTitlePaint);
|
||||
}
|
||||
|
||||
@@ -437,9 +433,9 @@ class SimpleMonthView extends View {
|
||||
int calendarDay = (i + mWeekStart) % mNumDays;
|
||||
int x = (2 * i + 1) * dayWidthHalf + mPadding;
|
||||
mDayLabelCalendar.set(Calendar.DAY_OF_WEEK, calendarDay);
|
||||
canvas.drawText(mDayLabelCalendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT,
|
||||
Locale.getDefault()).toUpperCase(Locale.getDefault()), x, y,
|
||||
mMonthDayLabelPaint);
|
||||
canvas.drawText("" + mDayLabelCalendar.getDisplayName(Calendar.DAY_OF_WEEK,
|
||||
Calendar.SHORT, Locale.getDefault()).toUpperCase(Locale.getDefault()).charAt(0),
|
||||
x, y, mMonthDayLabelPaint);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package android.widget;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.annotation.Widget;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
@@ -80,7 +81,7 @@ public class TimePicker extends FrameLayout {
|
||||
|
||||
final TypedArray a = context.obtainStyledAttributes(
|
||||
attrs, R.styleable.TimePicker, defStyleAttr, defStyleRes);
|
||||
int mode = a.getInt(R.styleable.TimePicker_timePickerMode, MODE_SPINNER);
|
||||
final int mode = a.getInt(R.styleable.TimePicker_timePickerMode, MODE_SPINNER);
|
||||
a.recycle();
|
||||
|
||||
switch (mode) {
|
||||
@@ -149,6 +150,16 @@ public class TimePicker extends FrameLayout {
|
||||
mDelegate.setOnTimeChangedListener(onTimeChangedListener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the callback that indicates the current time is valid.
|
||||
*
|
||||
* @param callback the callback, may be null
|
||||
* @hide
|
||||
*/
|
||||
public void setValidationCallback(@Nullable ValidationCallback callback) {
|
||||
mDelegate.setValidationCallback(callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEnabled(boolean enabled) {
|
||||
super.setEnabled(enabled);
|
||||
@@ -160,27 +171,6 @@ public class TimePicker extends FrameLayout {
|
||||
return mDelegate.isEnabled();
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
public void setShowDoneButton(boolean showDoneButton) {
|
||||
mDelegate.setShowDoneButton(showDoneButton);
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
public boolean isShowDoneButton() {
|
||||
return mDelegate.isShowDoneButton();
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
public void setDismissCallback(TimePickerDismissCallback callback) {
|
||||
mDelegate.setDismissCallback(callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getBaseline() {
|
||||
return mDelegate.getBaseline();
|
||||
@@ -244,14 +234,11 @@ public class TimePicker extends FrameLayout {
|
||||
boolean is24HourView();
|
||||
|
||||
void setOnTimeChangedListener(OnTimeChangedListener onTimeChangedListener);
|
||||
void setValidationCallback(ValidationCallback callback);
|
||||
|
||||
void setEnabled(boolean enabled);
|
||||
boolean isEnabled();
|
||||
|
||||
boolean isShowDoneButton();
|
||||
void setShowDoneButton(boolean showDoneButton);
|
||||
void setDismissCallback(TimePickerDismissCallback callback);
|
||||
|
||||
int getBaseline();
|
||||
|
||||
void onConfigurationChanged(Configuration newConfig);
|
||||
@@ -266,12 +253,13 @@ public class TimePicker extends FrameLayout {
|
||||
}
|
||||
|
||||
/**
|
||||
* A callback interface for dismissing the TimePicker when included into a Dialog
|
||||
* A callback interface for updating input validity when the TimePicker
|
||||
* when included into a Dialog.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public static interface TimePickerDismissCallback {
|
||||
void dismiss(TimePicker view, boolean isCancel, int hourOfDay, int minute);
|
||||
public static interface ValidationCallback {
|
||||
void onValidationChanged(boolean valid);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -288,7 +276,8 @@ public class TimePicker extends FrameLayout {
|
||||
protected Locale mCurrentLocale;
|
||||
|
||||
// Callbacks
|
||||
protected OnTimeChangedListener mOnTimeChangedListener;
|
||||
protected OnTimeChangedListener mOnTimeChangedListener;
|
||||
protected ValidationCallback mValidationCallback;
|
||||
|
||||
public AbstractTimePickerDelegate(TimePicker delegator, Context context) {
|
||||
mDelegator = delegator;
|
||||
@@ -304,5 +293,16 @@ public class TimePicker extends FrameLayout {
|
||||
}
|
||||
mCurrentLocale = locale;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValidationCallback(ValidationCallback callback) {
|
||||
mValidationCallback = callback;
|
||||
}
|
||||
|
||||
protected void onValidationChanged(boolean valid) {
|
||||
if (mValidationCallback != null) {
|
||||
mValidationCallback.onValidationChanged(valid);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Color;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.text.format.DateFormat;
|
||||
@@ -35,7 +34,6 @@ import android.view.inputmethod.EditorInfo;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import com.android.internal.R;
|
||||
|
||||
import java.text.DateFormatSymbols;
|
||||
import java.util.Calendar;
|
||||
import java.util.Locale;
|
||||
|
||||
@@ -46,29 +44,20 @@ import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES;
|
||||
* A delegate implementing the basic TimePicker
|
||||
*/
|
||||
class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate {
|
||||
|
||||
private static final boolean DEFAULT_ENABLED_STATE = true;
|
||||
|
||||
private static final int HOURS_IN_HALF_DAY = 12;
|
||||
|
||||
// state
|
||||
private boolean mIs24HourView;
|
||||
|
||||
private boolean mIsAm;
|
||||
|
||||
// ui components
|
||||
private final NumberPicker mHourSpinner;
|
||||
|
||||
private final NumberPicker mMinuteSpinner;
|
||||
|
||||
private final NumberPicker mAmPmSpinner;
|
||||
|
||||
private final EditText mHourSpinnerInput;
|
||||
|
||||
private final EditText mMinuteSpinnerInput;
|
||||
|
||||
private final EditText mAmPmSpinnerInput;
|
||||
|
||||
private final TextView mDivider;
|
||||
|
||||
// Note that the legacy implementation of the TimePicker is
|
||||
@@ -77,17 +66,10 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate {
|
||||
// accommodates these two cases to be backwards compatible.
|
||||
private final Button mAmPmButton;
|
||||
|
||||
// May be null if layout has no done button
|
||||
private final View mDoneButton;
|
||||
private boolean mShowDoneButton;
|
||||
private TimePicker.TimePickerDismissCallback mDismissCallback;
|
||||
|
||||
private final String[] mAmPmStrings;
|
||||
|
||||
private boolean mIsEnabled = DEFAULT_ENABLED_STATE;
|
||||
|
||||
private Calendar mTempCalendar;
|
||||
|
||||
private boolean mHourWithTwoDigit;
|
||||
private char mHourFormat;
|
||||
|
||||
@@ -227,20 +209,6 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
mDoneButton = delegator.findViewById(R.id.done_button);
|
||||
mShowDoneButton = (mDoneButton != null);
|
||||
if (mShowDoneButton) {
|
||||
mDoneButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (mDismissCallback != null) {
|
||||
mDismissCallback.dismiss(mDelegator, false, getCurrentHour(),
|
||||
getCurrentMinute());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
getHourFormatData();
|
||||
|
||||
// update controls to initial state
|
||||
@@ -265,8 +233,6 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate {
|
||||
if (mDelegator.getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
|
||||
mDelegator.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
|
||||
}
|
||||
|
||||
updateDoneButton();
|
||||
}
|
||||
|
||||
private void getHourFormatData() {
|
||||
@@ -431,30 +397,6 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate {
|
||||
return mIsEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setShowDoneButton(boolean showDoneButton) {
|
||||
if (mDoneButton != null) {
|
||||
mShowDoneButton = showDoneButton;
|
||||
updateDoneButton();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShowDoneButton() {
|
||||
return mShowDoneButton;
|
||||
}
|
||||
|
||||
private void updateDoneButton() {
|
||||
if (mDoneButton != null) {
|
||||
mDoneButton.setVisibility(mShowDoneButton ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDismissCallback(TimePicker.TimePickerDismissCallback callback) {
|
||||
mDismissCallback = callback;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getBaseline() {
|
||||
return mHourSpinner.getBaseline();
|
||||
@@ -467,8 +409,7 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate {
|
||||
|
||||
@Override
|
||||
public Parcelable onSaveInstanceState(Parcelable superState) {
|
||||
return new SavedState(superState, getCurrentHour(), getCurrentMinute(),
|
||||
isShowDoneButton());
|
||||
return new SavedState(superState, getCurrentHour(), getCurrentMinute());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -476,7 +417,6 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate {
|
||||
SavedState ss = (SavedState) state;
|
||||
setCurrentHour(ss.getHour());
|
||||
setCurrentMinute(ss.getMinute());
|
||||
setShowDoneButton(ss.isShowDoneButton());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -632,25 +572,19 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate {
|
||||
* Used to save / restore state of time picker
|
||||
*/
|
||||
private static class SavedState extends View.BaseSavedState {
|
||||
|
||||
private final int mHour;
|
||||
|
||||
private final int mMinute;
|
||||
|
||||
private final boolean mShowDoneButton;
|
||||
|
||||
private SavedState(Parcelable superState, int hour, int minute, boolean showDoneButton) {
|
||||
private SavedState(Parcelable superState, int hour, int minute) {
|
||||
super(superState);
|
||||
mHour = hour;
|
||||
mMinute = minute;
|
||||
mShowDoneButton = showDoneButton;
|
||||
}
|
||||
|
||||
private SavedState(Parcel in) {
|
||||
super(in);
|
||||
mHour = in.readInt();
|
||||
mMinute = in.readInt();
|
||||
mShowDoneButton = (in.readInt() == 1);
|
||||
}
|
||||
|
||||
public int getHour() {
|
||||
@@ -661,16 +595,11 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate {
|
||||
return mMinute;
|
||||
}
|
||||
|
||||
public boolean isShowDoneButton() {
|
||||
return mShowDoneButton;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
super.writeToParcel(dest, flags);
|
||||
dest.writeInt(mHour);
|
||||
dest.writeInt(mMinute);
|
||||
dest.writeInt(mShowDoneButton ? 1 : 0);
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unused", "hiding"})
|
||||
|
||||
@@ -43,7 +43,6 @@ import android.view.accessibility.AccessibilityNodeInfo;
|
||||
|
||||
import com.android.internal.R;
|
||||
|
||||
import java.text.DateFormatSymbols;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Locale;
|
||||
@@ -86,8 +85,6 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
private RadialTimePickerView mRadialTimePickerView;
|
||||
private TextView mSeparatorView;
|
||||
|
||||
private ViewGroup mLayoutButtons;
|
||||
|
||||
private String mAmText;
|
||||
private String mPmText;
|
||||
|
||||
@@ -101,16 +98,12 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
private String mDoublePlaceholderText;
|
||||
private String mDeletedKeyFormat;
|
||||
private boolean mInKbMode;
|
||||
private boolean mIsTimeValid = true;
|
||||
private ArrayList<Integer> mTypedTimes = new ArrayList<Integer>();
|
||||
private Node mLegalTimesTree;
|
||||
private int mAmKeyCode;
|
||||
private int mPmKeyCode;
|
||||
|
||||
// For showing the done button when in a Dialog
|
||||
private Button mDoneButton;
|
||||
private boolean mShowDoneButton;
|
||||
private TimePicker.TimePickerDismissCallback mDismissCallback;
|
||||
|
||||
// Accessibility strings.
|
||||
private String mHourPickerDescription;
|
||||
private String mSelectHours;
|
||||
@@ -146,7 +139,6 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
mSeparatorView = (TextView) mainView.findViewById(R.id.separator);
|
||||
mMinuteView = (TextView) mainView.findViewById(R.id.minutes);
|
||||
mAmPmTextView = (TextView) mainView.findViewById(R.id.ampm_label);
|
||||
mLayoutButtons = (ViewGroup) mainView.findViewById(R.id.layout_buttons);
|
||||
|
||||
// Set up text appearances from style.
|
||||
final int headerTimeTextAppearance = a.getResourceId(
|
||||
@@ -174,7 +166,6 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
final int headerBackgroundColor = a.getColor(
|
||||
R.styleable.TimePicker_headerBackgroundColor, Color.TRANSPARENT);
|
||||
if (headerBackgroundColor != Color.TRANSPARENT) {
|
||||
mLayoutButtons.setBackgroundColor(headerBackgroundColor);
|
||||
mainView.findViewById(R.id.time_header).setBackgroundColor(headerBackgroundColor);
|
||||
}
|
||||
|
||||
@@ -182,7 +173,6 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
|
||||
mRadialTimePickerView = (RadialTimePickerView) mainView.findViewById(
|
||||
R.id.radial_picker);
|
||||
mDoneButton = (Button) mainView.findViewById(R.id.done_button);
|
||||
|
||||
setupListeners();
|
||||
|
||||
@@ -199,16 +189,14 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
final Calendar calendar = Calendar.getInstance(mCurrentLocale);
|
||||
final int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
|
||||
final int currentMinute = calendar.get(Calendar.MINUTE);
|
||||
initialize(currentHour, currentMinute, false /* 12h */, HOUR_INDEX, false);
|
||||
initialize(currentHour, currentMinute, false /* 12h */, HOUR_INDEX);
|
||||
}
|
||||
|
||||
private void initialize(int hourOfDay, int minute, boolean is24HourView, int index,
|
||||
boolean showDoneButton) {
|
||||
private void initialize(int hourOfDay, int minute, boolean is24HourView, int index) {
|
||||
mInitialHourOfDay = hourOfDay;
|
||||
mInitialMinute = minute;
|
||||
mIs24HourView = is24HourView;
|
||||
mInKbMode = false;
|
||||
mShowDoneButton = showDoneButton;
|
||||
updateUI(index);
|
||||
}
|
||||
|
||||
@@ -236,21 +224,6 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
tryVibrate();
|
||||
}
|
||||
});
|
||||
mDoneButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (mInKbMode && isTypedTimeFullyLegal()) {
|
||||
finishKbMode(false);
|
||||
} else {
|
||||
tryVibrate();
|
||||
}
|
||||
if (mDismissCallback != null) {
|
||||
mDismissCallback.dismiss(mDelegator, false, getCurrentHour(),
|
||||
getCurrentMinute());
|
||||
}
|
||||
}
|
||||
});
|
||||
mDoneButton.setOnKeyListener(keyboardListener);
|
||||
}
|
||||
|
||||
private void updateUI(int index) {
|
||||
@@ -258,8 +231,6 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
updateRadialPicker(index);
|
||||
// Enable or disable the AM/PM view.
|
||||
updateHeaderAmPm();
|
||||
// Show or hide Done button
|
||||
updateDoneButton();
|
||||
// Update Hour and Minutes
|
||||
updateHeaderHour(mInitialHourOfDay, true);
|
||||
// Update time separator
|
||||
@@ -336,10 +307,6 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
}
|
||||
}
|
||||
|
||||
private void updateDoneButton() {
|
||||
mLayoutButtons.setVisibility(mShowDoneButton ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the current hour.
|
||||
*/
|
||||
@@ -446,17 +413,6 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
return mIsEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setShowDoneButton(boolean showDoneButton) {
|
||||
mShowDoneButton = showDoneButton;
|
||||
updateDoneButton();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDismissCallback(TimePicker.TimePickerDismissCallback callback) {
|
||||
mDismissCallback = callback;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getBaseline() {
|
||||
// does not support baseline alignment
|
||||
@@ -471,8 +427,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
@Override
|
||||
public Parcelable onSaveInstanceState(Parcelable superState) {
|
||||
return new SavedState(superState, getCurrentHour(), getCurrentMinute(),
|
||||
is24HourView(), inKbMode(), getTypedTimes(), getCurrentItemShowing(),
|
||||
isShowDoneButton());
|
||||
is24HourView(), inKbMode(), getTypedTimes(), getCurrentItemShowing());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -480,8 +435,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
SavedState ss = (SavedState) state;
|
||||
setInKbMode(ss.inKbMode());
|
||||
setTypedTimes(ss.getTypesTimes());
|
||||
initialize(ss.getHour(), ss.getMinute(), ss.is24HourMode(), ss.getCurrentItemShowing(),
|
||||
ss.isShowDoneButton());
|
||||
initialize(ss.getHour(), ss.getMinute(), ss.is24HourMode(), ss.getCurrentItemShowing());
|
||||
mRadialTimePickerView.invalidate();
|
||||
if (mInKbMode) {
|
||||
tryStartingKbMode(-1);
|
||||
@@ -560,11 +514,6 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
return mRadialTimePickerView.getCurrentItemShowing();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isShowDoneButton() {
|
||||
return mShowDoneButton;
|
||||
}
|
||||
|
||||
/**
|
||||
* Propagate the time change
|
||||
*/
|
||||
@@ -587,11 +536,10 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
private final boolean mInKbMode;
|
||||
private final ArrayList<Integer> mTypedTimes;
|
||||
private final int mCurrentItemShowing;
|
||||
private final boolean mShowDoneButton;
|
||||
|
||||
private SavedState(Parcelable superState, int hour, int minute, boolean is24HourMode,
|
||||
boolean isKbMode, ArrayList<Integer> typedTimes,
|
||||
int currentItemShowing, boolean showDoneButton) {
|
||||
int currentItemShowing) {
|
||||
super(superState);
|
||||
mHour = hour;
|
||||
mMinute = minute;
|
||||
@@ -599,7 +547,6 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
mInKbMode = isKbMode;
|
||||
mTypedTimes = typedTimes;
|
||||
mCurrentItemShowing = currentItemShowing;
|
||||
mShowDoneButton = showDoneButton;
|
||||
}
|
||||
|
||||
private SavedState(Parcel in) {
|
||||
@@ -610,7 +557,6 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
mInKbMode = (in.readInt() == 1);
|
||||
mTypedTimes = in.readArrayList(getClass().getClassLoader());
|
||||
mCurrentItemShowing = in.readInt();
|
||||
mShowDoneButton = (in.readInt() == 1);
|
||||
}
|
||||
|
||||
public int getHour() {
|
||||
@@ -637,10 +583,6 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
return mCurrentItemShowing;
|
||||
}
|
||||
|
||||
public boolean isShowDoneButton() {
|
||||
return mShowDoneButton;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
super.writeToParcel(dest, flags);
|
||||
@@ -650,7 +592,6 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
dest.writeInt(mInKbMode ? 1 : 0);
|
||||
dest.writeList(mTypedTimes);
|
||||
dest.writeInt(mCurrentItemShowing);
|
||||
dest.writeInt(mShowDoneButton ? 1 : 0);
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unused", "hiding"})
|
||||
@@ -852,12 +793,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
* @return true if the key was successfully processed, false otherwise.
|
||||
*/
|
||||
private boolean processKeyUp(int keyCode) {
|
||||
if (keyCode == KeyEvent.KEYCODE_ESCAPE || keyCode == KeyEvent.KEYCODE_BACK) {
|
||||
if (mDismissCallback != null) {
|
||||
mDismissCallback.dismiss(mDelegator, true, getCurrentHour(), getCurrentMinute());
|
||||
}
|
||||
return true;
|
||||
} else if (keyCode == KeyEvent.KEYCODE_TAB) {
|
||||
if (keyCode == KeyEvent.KEYCODE_ESCAPE || keyCode == KeyEvent.KEYCODE_TAB) {
|
||||
if(mInKbMode) {
|
||||
if (isTypedTimeFullyLegal()) {
|
||||
finishKbMode(true);
|
||||
@@ -876,9 +812,6 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
mRadialTimePickerView.getCurrentHour(),
|
||||
mRadialTimePickerView.getCurrentMinute());
|
||||
}
|
||||
if (mDismissCallback != null) {
|
||||
mDismissCallback.dismiss(mDelegator, false, getCurrentHour(), getCurrentMinute());
|
||||
}
|
||||
return true;
|
||||
} else if (keyCode == KeyEvent.KEYCODE_DEL) {
|
||||
if (mInKbMode) {
|
||||
@@ -933,7 +866,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
private void tryStartingKbMode(int keyCode) {
|
||||
if (keyCode == -1 || addKeyIfLegal(keyCode)) {
|
||||
mInKbMode = true;
|
||||
mDoneButton.setEnabled(false);
|
||||
onValidationChanged(false);
|
||||
updateDisplay(false);
|
||||
mRadialTimePickerView.setInputEnabled(false);
|
||||
}
|
||||
@@ -961,7 +894,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
mTypedTimes.add(mTypedTimes.size() - 1, KeyEvent.KEYCODE_0);
|
||||
mTypedTimes.add(mTypedTimes.size() - 1, KeyEvent.KEYCODE_0);
|
||||
}
|
||||
mDoneButton.setEnabled(true);
|
||||
onValidationChanged(true);
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -1002,7 +935,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
private int deleteLastTypedKey() {
|
||||
int deleted = mTypedTimes.remove(mTypedTimes.size() - 1);
|
||||
if (!isTypedTimeFullyLegal()) {
|
||||
mDoneButton.setEnabled(false);
|
||||
onValidationChanged(false);
|
||||
}
|
||||
return deleted;
|
||||
}
|
||||
@@ -1046,7 +979,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
|
||||
updateAmPmDisplay(hour < 12 ? AM : PM);
|
||||
}
|
||||
setCurrentItemShowing(mRadialTimePickerView.getCurrentItemShowing(), true, true, true);
|
||||
mDoneButton.setEnabled(true);
|
||||
onValidationChanged(true);
|
||||
} else {
|
||||
boolean[] enteredZeros = {false, false};
|
||||
int[] values = getEnteredTime(enteredZeros);
|
||||
|
||||
@@ -45,7 +45,7 @@ class YearPickerView extends ListView implements AdapterView.OnItemClickListener
|
||||
}
|
||||
|
||||
public YearPickerView(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
this(context, attrs, R.attr.listViewStyle);
|
||||
}
|
||||
|
||||
public YearPickerView(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
|
||||
@@ -20,26 +20,11 @@
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal" >
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="0dip"
|
||||
android:layout_weight="1"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<include layout="@layout/date_picker_header_view" />
|
||||
|
||||
<include layout="@layout/date_picker_selected_date" />
|
||||
</LinearLayout>
|
||||
|
||||
<include layout="@layout/date_picker_done_button" />
|
||||
</LinearLayout>
|
||||
<include
|
||||
layout="@layout/date_picker_selected_date"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent" />
|
||||
|
||||
<include layout="@layout/date_picker_view_animator" />
|
||||
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
@@ -30,39 +30,18 @@
|
||||
android:layout_width="@dimen/timepicker_left_side_width"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
<FrameLayout
|
||||
<include
|
||||
layout="@layout/time_header_label"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dip"
|
||||
android:layout_weight="1">
|
||||
<include
|
||||
layout="@layout/time_header_label"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/timepicker_header_height"
|
||||
android:layout_gravity="center" />
|
||||
</FrameLayout>
|
||||
<LinearLayout
|
||||
android:id="@+id/layout_buttons"
|
||||
style="?android:attr/buttonBarStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:divider="?android:attr/dividerHorizontal"
|
||||
android:showDividers="beginning">
|
||||
<Button
|
||||
android:id="@+id/done_button"
|
||||
style="?android:attr/buttonBarButtonStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="48dp"
|
||||
android:text="@string/done_label"
|
||||
android:textSize="@dimen/timepicker_done_label_size" />
|
||||
</LinearLayout>
|
||||
android:layout_weight="1"
|
||||
android:layout_gravity="center" />
|
||||
</LinearLayout>
|
||||
<android.widget.RadialTimePickerView
|
||||
android:id="@+id/radial_picker"
|
||||
android:layout_width="@dimen/timepicker_radial_picker_dimen"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true" />
|
||||
</LinearLayout>
|
||||
android:id="@+id/radial_picker"
|
||||
android:layout_width="@dimen/timepicker_radial_picker_dimen"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true" />
|
||||
</LinearLayout>
|
||||
|
||||
@@ -17,22 +17,14 @@
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/datepicker_default_view_animator_color_holo_light"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="@dimen/datepicker_selected_calendar_layout_height"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<include layout="@layout/date_picker_header_view" />
|
||||
|
||||
<include layout="@layout/date_picker_selected_date" />
|
||||
</LinearLayout>
|
||||
<include
|
||||
layout="@layout/date_picker_selected_date"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="@dimen/datepicker_selected_calendar_layout_height" />
|
||||
|
||||
<include layout="@layout/date_picker_view_animator" />
|
||||
|
||||
<include layout="@layout/date_picker_done_button" />
|
||||
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
@@ -68,7 +68,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="16dip"
|
||||
android:paddingEnd="16dip"
|
||||
android:paddingTop="16dip" />
|
||||
android:paddingTop="16dip"
|
||||
android:paddingBottom="16dip" />
|
||||
</ScrollView>
|
||||
</LinearLayout>
|
||||
|
||||
@@ -83,14 +84,12 @@
|
||||
</FrameLayout>
|
||||
|
||||
<LinearLayout android:id="@+id/buttonPanel"
|
||||
style="?attr/buttonBarStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="@dimen/alert_dialog_button_bar_height"
|
||||
android:orientation="vertical"
|
||||
android:gravity="end"
|
||||
android:padding="16dip">
|
||||
android:gravity="end">
|
||||
<LinearLayout
|
||||
style="?attr/buttonBarStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layoutDirection="locale">
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2013 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.
|
||||
-->
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/layout_buttons"
|
||||
style="?android:attr/buttonBarStyle"
|
||||
android:layout_width="@dimen/datepicker_component_width"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:divider="?android:attr/dividerHorizontal"
|
||||
android:showDividers="beginning" >
|
||||
|
||||
<Button
|
||||
android:id="@+id/done"
|
||||
style="?android:attr/buttonBarButtonStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="48dp"
|
||||
android:text="@string/done_label"
|
||||
android:textSize="@dimen/datepicker_done_label_size" />
|
||||
</LinearLayout>
|
||||
@@ -1,23 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2013 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.
|
||||
-->
|
||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/date_picker_header"
|
||||
android:layout_width="@dimen/datepicker_component_width"
|
||||
android:layout_height="@dimen/datepicker_header_height"
|
||||
android:gravity="center"
|
||||
android:importantForAccessibility="no"
|
||||
android:textAllCaps="true" />
|
||||
@@ -20,18 +20,11 @@
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<include layout="@layout/date_picker_header_view" />
|
||||
|
||||
<include layout="@layout/date_picker_selected_date" />
|
||||
</LinearLayout>
|
||||
<include
|
||||
layout="@layout/date_picker_selected_date"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<include layout="@layout/date_picker_view_animator" />
|
||||
|
||||
<include layout="@layout/date_picker_done_button" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -16,46 +16,53 @@
|
||||
-->
|
||||
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/day_picker_selector_layout"
|
||||
android:layout_width="@dimen/datepicker_component_width"
|
||||
android:layout_height="0dip"
|
||||
android:layout_weight="1"
|
||||
android:paddingTop="8dip"
|
||||
android:paddingBottom="8dip"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
android:id="@+id/day_picker_selector_layout"
|
||||
android:layout_width="@dimen/datepicker_component_width"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:paddingBottom="8dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/date_picker_header"
|
||||
android:layout_width="@dimen/datepicker_component_width"
|
||||
android:layout_height="@dimen/datepicker_header_height"
|
||||
android:gravity="center"
|
||||
android:importantForAccessibility="no"
|
||||
android:layout_marginBottom="8dp" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/date_picker_month_and_day_layout"
|
||||
android:id="@+id/date_picker_month_and_day_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_gravity="center"
|
||||
android:clickable="true"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/date_picker_month"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:duplicateParentState="true"
|
||||
android:gravity="center_horizontal|bottom" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/date_picker_day"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:clickable="true"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/date_picker_month"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:duplicateParentState="true"
|
||||
android:gravity="center_horizontal|bottom" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/date_picker_day"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginBottom="-10dip"
|
||||
android:layout_marginTop="-10dip"
|
||||
android:duplicateParentState="true"
|
||||
android:gravity="center" />
|
||||
android:layout_marginBottom="-10dip"
|
||||
android:layout_marginTop="-10dip"
|
||||
android:duplicateParentState="true"
|
||||
android:gravity="center" />
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/date_picker_year"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center_horizontal|top" />
|
||||
android:id="@+id/date_picker_year"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center_horizontal|top" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -14,20 +14,21 @@
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License
|
||||
-->
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/time_header"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center" >
|
||||
|
||||
<TextView
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/time_header"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center">
|
||||
<TextView
|
||||
android:id="@+id/hours"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toLeftOf="@+id/separator"
|
||||
android:layout_alignBaseline="@+id/separator"/>
|
||||
|
||||
<TextView
|
||||
android:layout_alignBaseline="@+id/separator" />
|
||||
<TextView
|
||||
android:id="@+id/separator"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -35,15 +36,13 @@
|
||||
android:paddingRight="@dimen/timepicker_separator_padding"
|
||||
android:layout_centerInParent="true"
|
||||
android:importantForAccessibility="no" />
|
||||
|
||||
<TextView
|
||||
<TextView
|
||||
android:id="@+id/minutes"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toRightOf="@+id/separator"
|
||||
android:layout_alignBaseline="@+id/separator" />
|
||||
|
||||
<TextView
|
||||
<TextView
|
||||
android:id="@+id/ampm_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -51,5 +50,5 @@
|
||||
android:paddingRight="@dimen/timepicker_ampm_left_padding"
|
||||
android:layout_toRightOf="@+id/separator"
|
||||
android:layout_alignBaseline="@+id/separator" />
|
||||
|
||||
</RelativeLayout>
|
||||
</RelativeLayout>
|
||||
</FrameLayout>
|
||||
|
||||
@@ -21,5 +21,4 @@
|
||||
android:id="@+id/timePicker"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
@@ -34,21 +34,4 @@
|
||||
android:layout_gravity="center"
|
||||
android:focusable="true"
|
||||
android:focusableInTouchMode="true" />
|
||||
<LinearLayout
|
||||
android:id="@+id/layout_buttons"
|
||||
style="?android:attr/buttonBarStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:divider="?android:attr/dividerHorizontal"
|
||||
android:showDividers="beginning">
|
||||
<Button
|
||||
android:id="@+id/done_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="48dp"
|
||||
android:text="@string/done_label"
|
||||
android:textSize="@dimen/timepicker_done_label_size"
|
||||
style="?android:attr/buttonBarButtonStyle" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
@@ -79,14 +79,4 @@
|
||||
android:focusableInTouchMode="true"
|
||||
/>
|
||||
|
||||
<!-- Width fixed here because TextView doesn't set MEASURED_STATE_TOO_SMALL -->
|
||||
<Button
|
||||
android:id="@+id/done_button"
|
||||
android:layout_width="100dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:text="@string/done_label"
|
||||
android:textSize="@dimen/timepicker_done_label_size"
|
||||
style="?android:attr/buttonBarButtonStyle" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -355,7 +355,6 @@
|
||||
<dimen name="timepicker_time_label_size">60sp</dimen>
|
||||
<dimen name="timepicker_extra_time_label_margin">-30dp</dimen>
|
||||
<dimen name="timepicker_ampm_label_size">16sp</dimen>
|
||||
<dimen name="timepicker_done_label_size">14sp</dimen>
|
||||
<dimen name="timepicker_ampm_left_padding">6dip</dimen>
|
||||
<dimen name="timepicker_separator_padding">4dip</dimen>
|
||||
<dimen name="timepicker_header_height">96dip</dimen>
|
||||
@@ -363,13 +362,14 @@
|
||||
<dimen name="timepicker_minimum_margin_top_bottom">24dip</dimen>
|
||||
<dimen name="timepicker_radial_picker_dimen">270dip</dimen>
|
||||
|
||||
<dimen name="datepicker_done_label_size">14sp</dimen>
|
||||
<dimen name="datepicker_day_number_size">16sp</dimen>
|
||||
<!-- Used by SimpleMonthView -->
|
||||
<dimen name="datepicker_day_number_size">12sp</dimen>
|
||||
<dimen name="datepicker_month_label_size">16sp</dimen>
|
||||
<dimen name="datepicker_month_day_label_text_size">10sp</dimen>
|
||||
<dimen name="datepicker_month_day_label_text_size">12sp</dimen>
|
||||
<dimen name="datepicker_month_list_item_header_height">48dp</dimen>
|
||||
<dimen name="datepicker_day_number_select_circle_radius">16dp</dimen>
|
||||
<dimen name="datepicker_month_list_item_header_height">50dp</dimen>
|
||||
<dimen name="datepicker_view_animator_height">270dp</dimen>
|
||||
<dimen name="datepicker_view_animator_height">250dp</dimen>
|
||||
|
||||
<dimen name="datepicker_year_picker_padding_top">8dp</dimen>
|
||||
<dimen name="datepicker_year_label_height">64dp</dimen>
|
||||
<dimen name="datepicker_year_label_text_size">22dp</dimen>
|
||||
|
||||
@@ -343,37 +343,37 @@ please see styles_device_defaults.xml.
|
||||
|
||||
<style name="TextAppearance.Material.TimePicker.TimeLabel" parent="TextAppearance.Material">
|
||||
<item name="textSize">@dimen/timepicker_time_label_size</item>
|
||||
<item name="textColor">?attr/textColorPrimary</item>
|
||||
<item name="textColor">?attr/textColorSecondaryInverse</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Material.TimePicker.AmPmLabel" parent="TextAppearance.Material">
|
||||
<item name="textSize">@dimen/timepicker_ampm_label_size</item>
|
||||
<item name="textAllCaps">true</item>
|
||||
<item name="textColor">?attr/textColorPrimary</item>
|
||||
<item name="textColor">?attr/textColorSecondaryInverse</item>
|
||||
<item name="textStyle">bold</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Material.DatePicker.DayOfWeekLabel" parent="TextAppearance.Material">
|
||||
<item name="includeFontPadding">false</item>
|
||||
<item name="textColor">?attr/textColorPrimary</item>
|
||||
<item name="textColor">?attr/textColorPrimaryInverse</item>
|
||||
<item name="textSize">@dimen/datepicker_header_text_size</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Material.DatePicker.MonthLabel" parent="TextAppearance.Material">
|
||||
<item name="includeFontPadding">false</item>
|
||||
<item name="textColor">?attr/textColorPrimary</item> <!-- selected should be accent -->
|
||||
<item name="textColor">?attr/textColorSecondaryInverse</item> <!-- selected should be accent -->
|
||||
<item name="textSize">@dimen/datepicker_selected_date_month_size</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Material.DatePicker.DayOfMonthLabel" parent="TextAppearance.Material">
|
||||
<item name="includeFontPadding">false</item>
|
||||
<item name="textColor">?attr/textColorPrimary</item> <!-- selected should be accent -->
|
||||
<item name="textColor">?attr/textColorSecondaryInverse</item> <!-- selected should be accent -->
|
||||
<item name="textSize">@dimen/datepicker_selected_date_day_size</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Material.DatePicker.YearLabel" parent="TextAppearance.Material">
|
||||
<item name="includeFontPadding">false</item>
|
||||
<item name="textColor">?attr/textColorPrimary</item> <!-- selected should be accent -->
|
||||
<item name="textColor">?attr/textColorSecondaryInverse</item> <!-- selected should be accent -->
|
||||
<item name="textSize">@dimen/datepicker_selected_date_year_size</item>
|
||||
</style>
|
||||
|
||||
@@ -471,6 +471,10 @@ please see styles_device_defaults.xml.
|
||||
|
||||
<style name="Widget.Material.ButtonBar.AlertDialog">
|
||||
<item name="background">@null</item>
|
||||
<item name="paddingStart">16dp</item>
|
||||
<item name="paddingEnd">16dp</item>
|
||||
<item name="paddingBottom">16dp</item>
|
||||
<item name="minHeight">@dimen/alert_dialog_button_bar_height</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.Material.SearchView">
|
||||
@@ -592,10 +596,10 @@ please see styles_device_defaults.xml.
|
||||
<item name="internalLayout">@layout/time_picker_holo</item>
|
||||
<item name="headerTimeTextAppearance">@style/TextAppearance.Material.TimePicker.TimeLabel</item>
|
||||
<item name="headerAmPmTextAppearance">@style/TextAppearance.Material.TimePicker.AmPmLabel</item>
|
||||
<item name="headerSelectedTextColor">?attr/colorControlActivated</item>
|
||||
<item name="headerBackgroundColor">@color/transparent</item>
|
||||
<item name="headerSelectedTextColor">?attr/textColorPrimaryInverse</item>
|
||||
<item name="headerBackgroundColor">?attr/colorAccent</item>
|
||||
<item name="numbersTextColor">?attr/textColorSecondary</item>
|
||||
<item name="numbersBackgroundColor">@color/transparent</item>
|
||||
<item name="numbersBackgroundColor">#10ffffff</item>
|
||||
<item name="amPmTextColor">?attr/textColorSecondary</item>
|
||||
<item name="amPmBackgroundColor">@color/transparent</item>
|
||||
<item name="amPmSelectedBackgroundColor">?attr/colorControlActivated</item>
|
||||
@@ -608,13 +612,13 @@ please see styles_device_defaults.xml.
|
||||
<!-- Attributes for new-style DatePicker. -->
|
||||
<item name="internalLayout">@layout/date_picker_holo</item>
|
||||
<item name="calendarViewShown">true</item>
|
||||
<item name="dayOfWeekBackgroundColor">@color/transparent</item>
|
||||
<item name="dayOfWeekBackgroundColor">#10000000</item>
|
||||
<item name="dayOfWeekTextAppearance">@style/TextAppearance.Material.DatePicker.DayOfWeekLabel</item>
|
||||
<item name="headerMonthTextAppearance">@style/TextAppearance.Material.DatePicker.MonthLabel</item>
|
||||
<item name="headerDayOfMonthTextAppearance">@style/TextAppearance.Material.DatePicker.DayOfMonthLabel</item>
|
||||
<item name="headerYearTextAppearance">@style/TextAppearance.Material.DatePicker.YearLabel</item>
|
||||
<item name="headerSelectedTextColor">?attr/colorControlActivated</item>
|
||||
<item name="headerBackgroundColor">@color/transparent</item>
|
||||
<item name="headerSelectedTextColor">?attr/textColorPrimaryInverse</item>
|
||||
<item name="headerBackgroundColor">?attr/colorAccent</item>
|
||||
<item name="yearListItemTextAppearance">@style/TextAppearance.Material.DatePicker.List.YearLabel</item>
|
||||
<item name="yearListSelectorColor">?attr/colorControlActivated</item>
|
||||
<item name="calendarTextColor">?attr/textColorSecondary</item>
|
||||
@@ -935,7 +939,11 @@ please see styles_device_defaults.xml.
|
||||
</style>
|
||||
|
||||
<style name="Widget.Material.Light.NumberPicker" parent="Widget.Material.NumberPicker"/>
|
||||
<style name="Widget.Material.Light.TimePicker" parent="Widget.Material.TimePicker" />
|
||||
|
||||
<style name="Widget.Material.Light.TimePicker" parent="Widget.Material.TimePicker">
|
||||
<item name="numbersBackgroundColor">#10000000</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.Material.Light.DatePicker" parent="Widget.Material.DatePicker" />
|
||||
<style name="Widget.Material.Light.ActivityChooserView" parent="Widget.Material.ActivityChooserView" />
|
||||
<style name="Widget.Material.Light.ImageWell" parent="Widget.Material.ImageWell"/>
|
||||
|
||||
@@ -1870,8 +1870,6 @@
|
||||
<java-symbol type="id" name="ampm_label" />
|
||||
<java-symbol type="id" name="radial_picker" />
|
||||
<java-symbol type="id" name="separator" />
|
||||
<java-symbol type="id" name="layout_buttons" />
|
||||
<java-symbol type="id" name="done_button" />
|
||||
<java-symbol type="id" name="date_picker_header" />
|
||||
<java-symbol type="id" name="date_picker_month_and_day_layout" />
|
||||
<java-symbol type="id" name="day_picker_selector_layout" />
|
||||
@@ -1879,7 +1877,6 @@
|
||||
<java-symbol type="id" name="date_picker_day" />
|
||||
<java-symbol type="id" name="date_picker_year" />
|
||||
<java-symbol type="id" name="animator" />
|
||||
<java-symbol type="id" name="done" />
|
||||
|
||||
<java-symbol type="string" name="done_label" />
|
||||
<java-symbol type="string" name="hour_picker_description" />
|
||||
|
||||
@@ -354,10 +354,10 @@ please see themes_device_defaults.xml.
|
||||
<item name="timePickerStyle">@style/Widget.Material.TimePicker</item>
|
||||
|
||||
<!-- TimePicker dialog theme -->
|
||||
<item name="timePickerDialogTheme">?attr/alertDialogTheme</item>
|
||||
<item name="timePickerDialogTheme">?attr/dialogTheme</item>
|
||||
|
||||
<!-- DatePicker style -->
|
||||
<item name="datePickerStyle">?attr/alertDialogTheme</item>
|
||||
<item name="datePickerStyle">?attr/dialogTheme</item>
|
||||
|
||||
<!-- DatePicker dialog theme -->
|
||||
<item name="datePickerDialogTheme">@style/Theme.Material.Dialog.Alert</item>
|
||||
@@ -697,13 +697,13 @@ please see themes_device_defaults.xml.
|
||||
<item name="timePickerStyle">@style/Widget.Material.Light.TimePicker</item>
|
||||
|
||||
<!-- TimePicker dialog theme -->
|
||||
<item name="timePickerDialogTheme">?attr/alertDialogTheme</item>
|
||||
<item name="timePickerDialogTheme">?attr/dialogTheme</item>
|
||||
|
||||
<!-- DatePicker style -->
|
||||
<item name="datePickerStyle">@style/Widget.Material.Light.DatePicker</item>
|
||||
|
||||
<!-- DatePicker dialog theme -->
|
||||
<item name="datePickerDialogTheme">?attr/alertDialogTheme</item>
|
||||
<item name="datePickerDialogTheme">?attr/dialogTheme</item>
|
||||
|
||||
<item name="fastScrollThumbDrawable">@drawable/fastscroll_thumb_material</item>
|
||||
<item name="fastScrollPreviewBackgroundLeft">@drawable/fastscroll_label_left_holo_light</item>
|
||||
@@ -1187,19 +1187,6 @@ please see themes_device_defaults.xml.
|
||||
AlertDialog theme. -->
|
||||
<style name="Theme.Material.Light.Dialog.Alert" parent="Theme.Material.Light.Dialog.BaseAlert"/>
|
||||
|
||||
<!-- Base theme used to prevent circular references in Leanback overrides. -->
|
||||
<style name="Theme.Material.Light.Dialog.BaseTimePicker" />
|
||||
|
||||
<!-- Material Light theme for the TimePicker dialog windows, which is used by the
|
||||
{@link android.app.TimePickerDialog} class. -->
|
||||
<style name="Theme.Material.Light.Dialog.TimePicker" parent="Theme.Material.Light.Dialog.BaseTimePicker" />
|
||||
|
||||
<style name="Theme.Material.Light.Dialog.BaseDatePicker" />
|
||||
|
||||
<!-- Material Light theme for the DatePicker dialog windows, which is used by the
|
||||
{@link android.app.DatePickerDialog} class. -->
|
||||
<style name="Theme.Material.Light.Dialog.DatePicker" parent="Theme.Material.Light.Dialog.BaseDatePicker"/>
|
||||
|
||||
<!-- Theme for a presentation window on a secondary display. -->
|
||||
<style name="Theme.Material.Light.Dialog.Presentation" parent="@style/Theme.Material.Light.NoActionBar.Fullscreen" />
|
||||
|
||||
|
||||
Reference in New Issue
Block a user