/** * Copyright (c) 2012 Todoroo Inc * * See the file "LICENSE" for the full license governing this code. */ package com.todoroo.astrid.ui; import java.util.Calendar; import android.content.Context; import android.content.res.Resources; import android.text.format.DateUtils; import android.util.AttributeSet; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.LinearLayout; import android.widget.ToggleButton; import com.timsu.astrid.R; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.Preferences; public class AstridTimePicker extends LinearLayout { private final ToggleButton noTimeCheck; private final ToggleButton amButton; private final ToggleButton pmButton; private final NumberPicker hours; private final NumberPicker minutes; private TimePickerEnabledChangedListener listener; private boolean is24Hour; private boolean lastSelectionWasPm; // false for AM, true for PM private final boolean useShortcuts; public interface TimePickerEnabledChangedListener { public void timePickerEnabledChanged(boolean hasTime); } public AstridTimePicker(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); useShortcuts = Preferences.getBoolean(R.string.p_use_date_shortcuts, true); int layout = useShortcuts ? R.layout.astrid_time_picker : R.layout.astrid_time_picker_horizontal; inflater.inflate(layout, this, true); noTimeCheck = (ToggleButton) findViewById(R.id.hasTime); amButton = (ToggleButton) findViewById(R.id.am_button); pmButton = (ToggleButton) findViewById(R.id.pm_button); hours = (NumberPicker) findViewById(R.id.hours); minutes = (NumberPicker) findViewById(R.id.minutes); if (Preferences.getBoolean(R.string.p_time_increment, false)) minutes.setIncrementBy(5); else minutes.setIncrementBy(1); setupButtonBackgrounds(context); initialize(context); } private void setupButtonBackgrounds(Context context) { Resources r = context.getResources(); TypedValue onColor = new TypedValue(); context.getTheme().resolveAttribute(R.attr.asThemeTextColor, onColor, false); int onColorValue = r.getColor(onColor.data); int offColorValue = r.getColor(android.R.color.transparent); int borderColorValue = r.getColor(android.R.color.transparent); int cornerRadius = (int) (5 * r.getDisplayMetrics().density); int strokeWidth = (int) (1 * r.getDisplayMetrics().density); amButton.setBackgroundDrawable(CustomBorderDrawable.customButton(cornerRadius, 0, 0, cornerRadius, onColorValue, offColorValue, borderColorValue, strokeWidth)); pmButton.setBackgroundDrawable(CustomBorderDrawable.customButton(0, cornerRadius, cornerRadius, 0, onColorValue, offColorValue, borderColorValue, strokeWidth)); noTimeCheck.setBackgroundDrawable(CustomBorderDrawable.customButton(cornerRadius, cornerRadius, cornerRadius, cornerRadius, onColorValue, offColorValue, borderColorValue, strokeWidth)); hours.findViewById(R.id.increment).setBackgroundDrawable( CustomBorderDrawable.customButton(cornerRadius, 0, 0, 0, onColorValue, offColorValue, borderColorValue, strokeWidth)); hours.findViewById(R.id.decrement).setBackgroundDrawable( CustomBorderDrawable.customButton(0, 0, 0, cornerRadius, onColorValue, offColorValue, borderColorValue, strokeWidth)); minutes.findViewById(R.id.increment).setBackgroundDrawable( CustomBorderDrawable.customButton(0, cornerRadius, 0, 0, onColorValue, offColorValue, borderColorValue, strokeWidth)); minutes.findViewById(R.id.decrement).setBackgroundDrawable( CustomBorderDrawable.customButton(0, 0, cornerRadius, 0, onColorValue, offColorValue, borderColorValue, strokeWidth)); if (!useShortcuts) { View[] pickers = new View[] { hours, minutes }; for (View view : pickers) { View v = view.findViewById(R.id.timepicker_input); LayoutParams lp = (LinearLayout.LayoutParams) v.getLayoutParams(); lp.height = (int) (46 * r.getDisplayMetrics().density); } } } private void initialize(Context context) { if (DateUtilities.is24HourFormat(context)) { hours.setRange(0, 23); is24Hour = true; findViewById(R.id.am_pm_container).setVisibility(View.GONE); } else { hours.setRange(1, 12); is24Hour = false; } minutes.setRange(0, 59); NumberPicker.OnChangedListener autoEnableTimeCheck = new NumberPicker.OnChangedListener() { @Override public int onChanged(NumberPicker picker, int oldVal, int newVal) { setHasTime(true); return newVal; } }; String amString = DateUtils.getAMPMString(Calendar.AM).toUpperCase(); amButton.setTextOff(amString); amButton.setTextOn(amString); amButton.setChecked(false); String pmString = DateUtils.getAMPMString(Calendar.PM).toUpperCase(); pmButton.setTextOff(pmString); pmButton.setTextOn(pmString); pmButton.setChecked(false); amButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { noTimeCheck.setChecked(false); amButton.setChecked(true); pmButton.setChecked(false); lastSelectionWasPm = false; } }); pmButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { noTimeCheck.setChecked(false); amButton.setChecked(false); pmButton.setChecked(true); lastSelectionWasPm = true; } }); String noTime = context.getString(R.string.TEA_no_time); noTimeCheck.setTextOff(noTime); noTimeCheck.setTextOn(noTime); hours.setOnChangeListener(autoEnableTimeCheck); minutes.setOnChangeListener(autoEnableTimeCheck); noTimeCheck.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { setHasTime(!isChecked, false); } }); minutes.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); } public void setHasTime(boolean hasTime) { setHasTime(hasTime, true); } public void setHasTime(boolean hasTime, boolean setChecked) { if (setChecked) noTimeCheck.setChecked(!hasTime); if (noTimeCheck.isChecked()) { hours.setText(""); //$NON-NLS-1$ minutes.setText(""); //$NON-NLS-1$ lastSelectionWasPm = pmButton.isChecked(); amButton.setChecked(false); pmButton.setChecked(false); } else { hours.validateAndUpdate(); minutes.validateAndUpdate(); amButton.setChecked(!lastSelectionWasPm); pmButton.setChecked(lastSelectionWasPm); } if (listener != null) listener.timePickerEnabledChanged(hasTime); } public boolean hasTime() { return !noTimeCheck.isChecked(); } public void forceNoTime() { if (!noTimeCheck.isChecked()) noTimeCheck.performClick(); } public void setHours(int hour) { boolean pm = false; if (!is24Hour) { if (hour == 0) { hour = 12; } else if (hour == 12) { pm = true; } else if (hour > 12) { hour -= 12; pm = true; } } amButton.setChecked(!pm); pmButton.setChecked(pm); lastSelectionWasPm = pm; hours.setCurrent(hour); } public int getHours() { int toReturn = hours.getCurrent(); if (!is24Hour) { if (toReturn == 12) { if (amButton.isChecked()) toReturn = 0; } else if (pmButton.isChecked()) { toReturn += 12; } } return toReturn; } public void setMinutes(int minute) { minutes.setCurrent(minute); } public int getMinutes() { return minutes.getCurrent(); } public void setTimePickerEnabledChangedListener(TimePickerEnabledChangedListener listener) { this.listener = listener; } }