From 309b6cbcafb127928e1e7e5166db59e1ba8e0a24 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Thu, 18 Jun 2020 07:43:58 -0500 Subject: [PATCH] Implement reminder time picker; customize picker color --- .../datetimepicker/time/AmPmCirclesView.java | 12 +- .../time/RadialPickerLayout.java | 8 + .../time/RadialSelectorView.java | 8 +- .../datetimepicker/time/TimePickerDialog.java | 314 ++++++++----- .../main/res/layout/time_picker_dialog.xml | 16 +- .../habits/edit/EditHabitActivity.kt | 51 ++- .../habits/edit/EditHabitDialog.java | 3 +- .../SnoozeDelayPickerActivity.java | 4 +- .../main/res/layout/activity_edit_habit.xml | 420 +++++++++--------- .../src/main/res/values/strings.xml | 2 + 10 files changed, 474 insertions(+), 364 deletions(-) diff --git a/android/android-pickers/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java b/android/android-pickers/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java index f310a1d85..3c6316521 100644 --- a/android/android-pickers/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java +++ b/android/android-pickers/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java @@ -41,8 +41,8 @@ public class AmPmCirclesView extends View { private final Paint mPaint = new Paint(); private int mSelectedAlpha; private int mUnselectedColor; - private int mAmPmTextColor; - private int mSelectedColor; + protected int mAmPmTextColor = Color.WHITE; + protected int mSelectedColor = Color.BLUE; private float mCircleRadiusMultiplier; private float mAmPmCircleRadiusMultiplier; private String mAmText; @@ -73,8 +73,8 @@ public class AmPmCirclesView extends View { Resources res = context.getResources(); mUnselectedColor = res.getColor(R.color.white); - mSelectedColor = res.getColor(R.color.blue); - mAmPmTextColor = res.getColor(R.color.ampm_text_color); + //mSelectedColor = res.getColor(R.color.blue); + //mAmPmTextColor = res.getColor(R.color.ampm_text_color); mSelectedAlpha = SELECTED_ALPHA; String typefaceFamily = res.getString(R.string.sans_serif); Typeface tf = Typeface.create(typefaceFamily, Typeface.NORMAL); @@ -105,8 +105,8 @@ public class AmPmCirclesView extends View { mSelectedAlpha = SELECTED_ALPHA_THEME_DARK; } else { mUnselectedColor = res.getColor(R.color.white); - mSelectedColor = res.getColor(R.color.blue); - mAmPmTextColor = res.getColor(R.color.ampm_text_color); + //mSelectedColor = res.getColor(R.color.blue); + //mAmPmTextColor = res.getColor(R.color.ampm_text_color); mSelectedAlpha = SELECTED_ALPHA; } } diff --git a/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java b/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java index 265b98cf8..307424a3e 100644 --- a/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java +++ b/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java @@ -84,6 +84,14 @@ public class RadialPickerLayout extends FrameLayout implements OnTouchListener { private AnimatorSet mTransition; private Handler mHandler = new Handler(); + public void setColor(int selectedColor) + { + mHourRadialSelectorView.mPaint.setColor(selectedColor); + mMinuteRadialSelectorView.mPaint.setColor(selectedColor); + mAmPmCirclesView.mSelectedColor = selectedColor; + mAmPmCirclesView.mAmPmTextColor = selectedColor; + } + public interface OnValueSelectedListener { void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance); } diff --git a/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java b/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java index 48e4385b5..018147efa 100644 --- a/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java +++ b/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java @@ -40,7 +40,7 @@ public class RadialSelectorView extends View { // Alpha level for the line. private static final int FULL_ALPHA = Utils.FULL_ALPHA; - private final Paint mPaint = new Paint(); + protected final Paint mPaint = new Paint(); private boolean mIsInitialized; private boolean mDrawValuesReady; @@ -96,8 +96,6 @@ public class RadialSelectorView extends View { Resources res = context.getResources(); - int blue = res.getColor(R.color.blue); - mPaint.setColor(blue); mPaint.setAntiAlias(true); mSelectionAlpha = SELECTED_ALPHA; @@ -139,15 +137,11 @@ public class RadialSelectorView extends View { /* package */ void setTheme(Context context, boolean themeDark) { Resources res = context.getResources(); - int color; if (themeDark) { - color = res.getColor(R.color.red); mSelectionAlpha = SELECTED_ALPHA_THEME_DARK; } else { - color = res.getColor(R.color.blue); mSelectionAlpha = SELECTED_ALPHA; } - mPaint.setColor(color); } /** diff --git a/android/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java b/android/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java index 8863f7207..972241231 100644 --- a/android/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java +++ b/android/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java @@ -23,7 +23,9 @@ import android.app.*; import android.content.*; import android.content.res.*; import android.os.*; + import androidx.appcompat.app.*; + import android.util.*; import android.view.*; import android.view.View.*; @@ -39,7 +41,8 @@ import java.util.*; /** * Dialog to set a time. */ -public class TimePickerDialog extends AppCompatDialogFragment implements OnValueSelectedListener{ +public class TimePickerDialog extends AppCompatDialogFragment implements OnValueSelectedListener +{ private static final String TAG = "TimePickerDialog"; private static final String KEY_HOUR_OF_DAY = "hour_of_day"; @@ -108,37 +111,50 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue * The callback interface used to indicate the user is done filling in * the time (they clicked on the 'Set' button). */ - public interface OnTimeSetListener { + public interface OnTimeSetListener + { /** - * @param view The view associated with this listener. + * @param view The view associated with this listener. * @param hourOfDay The hour that was set. - * @param minute The minute that was set. + * @param minute The minute that was set. */ void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute); - - default void onTimeCleared(RadialPickerLayout view) {} + + default void onTimeCleared(RadialPickerLayout view) + { + } } - public TimePickerDialog() { + public TimePickerDialog() + { // Empty constructor required for dialog fragment. } @SuppressLint("Java") public TimePickerDialog(Context context, int theme, OnTimeSetListener callback, - int hourOfDay, int minute, boolean is24HourMode) { + int hourOfDay, int minute, boolean is24HourMode) + { // Empty constructor required for dialog fragment. } public static TimePickerDialog newInstance(OnTimeSetListener callback, - int hourOfDay, int minute, boolean is24HourMode) { + int hourOfDay, + int minute, + boolean is24HourMode, + int color) + { TimePickerDialog ret = new TimePickerDialog(); - ret.initialize(callback, hourOfDay, minute, is24HourMode); + ret.initialize(callback, hourOfDay, minute, is24HourMode, color); return ret; } public void initialize(OnTimeSetListener callback, - int hourOfDay, int minute, boolean is24HourMode) { + int hourOfDay, + int minute, + boolean is24HourMode, + int color) + { mCallback = callback; mInitialHourOfDay = hourOfDay; @@ -146,35 +162,41 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue mIs24HourMode = is24HourMode; mInKbMode = false; mThemeDark = false; + mSelectedColor = color; } /** * Set a dark or light theme. NOTE: this will only take effect for the next onCreateView. */ - public void setThemeDark(boolean dark) { + public void setThemeDark(boolean dark) + { mThemeDark = dark; } - public boolean isThemeDark() { + public boolean isThemeDark() + { return mThemeDark; } - public void setOnTimeSetListener(OnTimeSetListener callback) { + public void setOnTimeSetListener(OnTimeSetListener callback) + { mCallback = callback; } - public void setStartTime(int hourOfDay, int minute) { + public void setStartTime(int hourOfDay, int minute) + { mInitialHourOfDay = hourOfDay; mInitialMinute = minute; mInKbMode = false; } @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate(Bundle savedInstanceState) + { super.onCreate(savedInstanceState); if (savedInstanceState != null && savedInstanceState.containsKey(KEY_HOUR_OF_DAY) - && savedInstanceState.containsKey(KEY_MINUTE) - && savedInstanceState.containsKey(KEY_IS_24_HOUR_VIEW)) { + && savedInstanceState.containsKey(KEY_MINUTE) + && savedInstanceState.containsKey(KEY_IS_24_HOUR_VIEW)) { mInitialHourOfDay = savedInstanceState.getInt(KEY_HOUR_OF_DAY); mInitialMinute = savedInstanceState.getInt(KEY_MINUTE); mIs24HourMode = savedInstanceState.getBoolean(KEY_IS_24_HOUR_VIEW); @@ -191,7 +213,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + Bundle savedInstanceState) + { getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE); View view = inflater.inflate(R.layout.time_picker_dialog, null); @@ -203,8 +226,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue mSelectHours = res.getString(R.string.select_hours); mMinutePickerDescription = res.getString(R.string.minute_picker_description); mSelectMinutes = res.getString(R.string.select_minutes); - mSelectedColor = res.getColor(mThemeDark? R.color.red : R.color.blue); - mUnselectedColor = res.getColor(mThemeDark? R.color.white : R.color.numbers_text_color); + //mSelectedColor = res.getColor(mThemeDark ? R.color.red : R.color.blue); + mUnselectedColor = res.getColor(mThemeDark ? R.color.white : R.color.numbers_text_color); mHourView = (TextView) view.findViewById(R.id.hours); mHourView.setOnKeyListener(keyboardListener); @@ -223,8 +246,9 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue mTimePicker = (RadialPickerLayout) view.findViewById(R.id.time_picker); mTimePicker.setOnValueSelectedListener(this); mTimePicker.setOnKeyListener(keyboardListener); + mTimePicker.setColor(mSelectedColor); mTimePicker.initialize(getActivity(), mHapticFeedbackController, mInitialHourOfDay, - mInitialMinute, mIs24HourMode); + mInitialMinute, mIs24HourMode); int currentItemShowing = HOUR_INDEX; if (savedInstanceState != null && @@ -234,25 +258,31 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue setCurrentItemShowing(currentItemShowing, false, true, true); mTimePicker.invalidate(); - mHourView.setOnClickListener(new OnClickListener() { + mHourView.setOnClickListener(new OnClickListener() + { @Override - public void onClick(View v) { + public void onClick(View v) + { setCurrentItemShowing(HOUR_INDEX, true, false, true); tryVibrate(); } }); - mMinuteView.setOnClickListener(new OnClickListener() { + mMinuteView.setOnClickListener(new OnClickListener() + { @Override - public void onClick(View v) { + public void onClick(View v) + { setCurrentItemShowing(MINUTE_INDEX, true, false, true); tryVibrate(); } }); mDoneButton = (TextView) view.findViewById(R.id.done_button); - mDoneButton.setOnClickListener(new OnClickListener() { + mDoneButton.setOnClickListener(new OnClickListener() + { @Override - public void onClick(View v) { + public void onClick(View v) + { if (mInKbMode && isTypedTimeFullyLegal()) { finishKbMode(false); } else { @@ -260,25 +290,25 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } if (mCallback != null) { mCallback.onTimeSet(mTimePicker, - mTimePicker.getHours(), mTimePicker.getMinutes()); + mTimePicker.getHours(), mTimePicker.getMinutes()); } dismiss(); } }); mDoneButton.setOnKeyListener(keyboardListener); - + mClearButton = (TextView) view.findViewById(R.id.clear_button); mClearButton.setOnClickListener(new OnClickListener() - { - @Override - public void onClick(View v) - { - if(mCallback != null) { - mCallback.onTimeCleared(mTimePicker); - } - dismiss(); - } - }); + { + @Override + public void onClick(View v) + { + if (mCallback != null) { + mCallback.onTimeCleared(mTimePicker); + } + dismiss(); + } + }); mClearButton.setOnKeyListener(keyboardListener); // Enable or disable the AM/PM view. @@ -293,15 +323,17 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue separatorView.setLayoutParams(paramsSeparator); } else { mAmPmTextView.setVisibility(View.VISIBLE); - updateAmPmDisplay(mInitialHourOfDay < 12? AM : PM); - mAmPmHitspace.setOnClickListener(new OnClickListener() { + updateAmPmDisplay(mInitialHourOfDay < 12 ? AM : PM); + mAmPmHitspace.setOnClickListener(new OnClickListener() + { @Override - public void onClick(View v) { + public void onClick(View v) + { tryVibrate(); int amOrPm = mTimePicker.getIsCurrentlyAmOrPm(); if (amOrPm == AM) { amOrPm = PM; - } else if (amOrPm == PM){ + } else if (amOrPm == PM) { amOrPm = AM; } updateAmPmDisplay(amOrPm); @@ -328,56 +360,61 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue mTypedTimes = new ArrayList(); } - // Set the theme at the end so that the initialize()s above don't counteract the theme. - mTimePicker.setTheme(getActivity().getApplicationContext(), mThemeDark); - // Prepare some palette to use. - int white = res.getColor(R.color.white); - int circleBackground = res.getColor(R.color.circle_background); - int line = res.getColor(R.color.line_background); - int timeDisplay = res.getColor(R.color.numbers_text_color); - ColorStateList doneTextColor = res.getColorStateList(R.color.done_text_color); - int doneBackground = R.drawable.done_background_color; - int darkGray = res.getColor(R.color.dark_gray); - int lightGray = res.getColor(R.color.light_gray); - int darkLine = res.getColor(R.color.line_dark); - ColorStateList darkDoneTextColor = res.getColorStateList(R.color.done_text_color_dark); - int darkDoneBackground = R.drawable.done_background_color_dark; +// // Set the theme at the end so that the initialize()s above don't counteract the theme. +// mTimePicker.setTheme(getActivity().getApplicationContext(), mThemeDark); +// // Prepare some palette to use. +// int white = res.getColor(R.color.white); +// int circleBackground = res.getColor(R.color.circle_background); +// int line = res.getColor(R.color.line_background); +// int timeDisplay = res.getColor(R.color.numbers_text_color); +// ColorStateList doneTextColor = res.getColorStateList(R.color.done_text_color); +// int doneBackground = R.drawable.done_background_color; +// +// int darkGray = res.getColor(R.color.dark_gray); +// int lightGray = res.getColor(R.color.light_gray); +// int darkLine = res.getColor(R.color.line_dark); +// ColorStateList darkDoneTextColor = res.getColorStateList(R.color.done_text_color_dark); +// int darkDoneBackground = R.drawable.done_background_color_dark; // Set the palette for each view based on the theme. - view.findViewById(R.id.time_display_background).setBackgroundColor(mThemeDark? darkGray : white); - view.findViewById(R.id.time_display).setBackgroundColor(mThemeDark? darkGray : white); - ((TextView) view.findViewById(R.id.separator)).setTextColor(mThemeDark? white : timeDisplay); - ((TextView) view.findViewById(R.id.ampm_label)).setTextColor(mThemeDark? white : timeDisplay); - view.findViewById(R.id.line).setBackgroundColor(mThemeDark? darkLine : line); - mDoneButton.setTextColor(mThemeDark? darkDoneTextColor : doneTextColor); - mTimePicker.setBackgroundColor(mThemeDark? lightGray : circleBackground); - mDoneButton.setBackgroundResource(mThemeDark? darkDoneBackground : doneBackground); +// view.findViewById(R.id.time_display_background).setBackgroundColor(mThemeDark? darkGray : white); +// view.findViewById(R.id.time_display).setBackgroundColor(mThemeDark? darkGray : white); +// ((TextView) view.findViewById(R.id.separator)).setTextColor(mThemeDark? white : timeDisplay); +// ((TextView) view.findViewById(R.id.ampm_label)).setTextColor(mThemeDark? white : timeDisplay); +// view.findViewById(R.id.line).setBackgroundColor(mThemeDark? darkLine : line); +// mDoneButton.setTextColor(mThemeDark? darkDoneTextColor : doneTextColor); +// mTimePicker.setBackgroundColor(mThemeDark? lightGray : circleBackground); +// mDoneButton.setBackgroundResource(mThemeDark? darkDoneBackground : doneBackground); return view; } @Override - public void onResume() { + public void onResume() + { super.onResume(); mHapticFeedbackController.start(); } @Override - public void onPause() { + public void onPause() + { super.onPause(); mHapticFeedbackController.stop(); } - public void tryVibrate() { + public void tryVibrate() + { mHapticFeedbackController.tryVibrate(); } - private void updateAmPmDisplay(int amOrPm) { + private void updateAmPmDisplay(int amOrPm) + { if (amOrPm == AM) { mAmPmTextView.setText(mAmText); Utils.tryAccessibilityAnnounce(mTimePicker, mAmText); mAmPmHitspace.setContentDescription(mAmText); - } else if (amOrPm == PM){ + } else if (amOrPm == PM) { mAmPmTextView.setText(mPmText); Utils.tryAccessibilityAnnounce(mTimePicker, mPmText); mAmPmHitspace.setContentDescription(mPmText); @@ -387,7 +424,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } @Override - public void onSaveInstanceState(Bundle outState) { + public void onSaveInstanceState(Bundle outState) + { if (mTimePicker != null) { outState.putInt(KEY_HOUR_OF_DAY, mTimePicker.getHours()); outState.putInt(KEY_MINUTE, mTimePicker.getMinutes()); @@ -405,7 +443,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue * Called by the picker for updating the header display. */ @Override - public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) { + public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) + { if (pickerIndex == HOUR_INDEX) { setHour(newValue, false); String announcement = String.format("%d", newValue); @@ -417,7 +456,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } Utils.tryAccessibilityAnnounce(mTimePicker, announcement); - } else if (pickerIndex == MINUTE_INDEX){ + } else if (pickerIndex == MINUTE_INDEX) { setMinute(newValue); mTimePicker.setContentDescription(mMinutePickerDescription + ": " + newValue); } else if (pickerIndex == AMPM_INDEX) { @@ -430,7 +469,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } } - private void setHour(int value, boolean announce) { + private void setHour(int value, boolean announce) + { String format; if (mIs24HourMode) { format = "%02d"; @@ -450,7 +490,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } } - private void setMinute(int value) { + private void setMinute(int value) + { if (value == 60) { value = 0; } @@ -462,7 +503,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue // Show either Hours or Minutes. private void setCurrentItemShowing(int index, boolean animateCircle, boolean delayLabelAnimate, - boolean announce) { + boolean announce) + { mTimePicker.setCurrentItemShowing(index, animateCircle); TextView labelToAnimate; @@ -485,8 +527,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue labelToAnimate = mMinuteView; } - int hourColor = (index == HOUR_INDEX)? mSelectedColor : mUnselectedColor; - int minuteColor = (index == MINUTE_INDEX)? mSelectedColor : mUnselectedColor; + int hourColor = (index == HOUR_INDEX) ? mSelectedColor : mUnselectedColor; + int minuteColor = (index == MINUTE_INDEX) ? mSelectedColor : mUnselectedColor; mHourView.setTextColor(hourColor); mMinuteView.setTextColor(minuteColor); @@ -499,15 +541,17 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue /** * For keyboard mode, processes key events. + * * @param keyCode the pressed key. * @return true if the key was successfully processed, false otherwise. */ - private boolean processKeyUp(int keyCode) { + private boolean processKeyUp(int keyCode) + { if (keyCode == KeyEvent.KEYCODE_ESCAPE || keyCode == KeyEvent.KEYCODE_BACK) { dismiss(); return true; } else if (keyCode == KeyEvent.KEYCODE_TAB) { - if(mInKbMode) { + if (mInKbMode) { if (isTypedTimeFullyLegal()) { finishKbMode(true); } @@ -522,7 +566,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } if (mCallback != null) { mCallback.onTimeSet(mTimePicker, - mTimePicker.getHours(), mTimePicker.getMinutes()); + mTimePicker.getHours(), mTimePicker.getMinutes()); } dismiss(); return true; @@ -539,7 +583,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue deletedKeyStr = String.format("%d", getValFromKeyCode(deleted)); } Utils.tryAccessibilityAnnounce(mTimePicker, - String.format(mDeletedKeyFormat, deletedKeyStr)); + String.format(mDeletedKeyFormat, deletedKeyStr)); updateDisplay(true); } } @@ -549,7 +593,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue || keyCode == KeyEvent.KEYCODE_6 || keyCode == KeyEvent.KEYCODE_7 || keyCode == KeyEvent.KEYCODE_8 || keyCode == KeyEvent.KEYCODE_9 || (!mIs24HourMode && - (keyCode == getAmOrPmKeyCode(AM) || keyCode == getAmOrPmKeyCode(PM)))) { + (keyCode == getAmOrPmKeyCode(AM) || keyCode == getAmOrPmKeyCode(PM)))) { if (!mInKbMode) { if (mTimePicker == null) { // Something's wrong, because time picker should definitely not be null. @@ -572,11 +616,13 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue /** * Try to start keyboard mode with the specified key, as long as the timepicker is not in the * middle of a touch-event. + * * @param keyCode The key to use as the first press. Keyboard mode will not be started if the - * key is not legal to start with. Or, pass in -1 to get into keyboard mode without a starting - * key. + * key is not legal to start with. Or, pass in -1 to get into keyboard mode without a starting + * key. */ - private void tryStartingKbMode(int keyCode) { + private void tryStartingKbMode(int keyCode) + { if (mTimePicker.trySettingInputEnabled(false) && (keyCode == -1 || addKeyIfLegal(keyCode))) { mInKbMode = true; @@ -585,7 +631,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } } - private boolean addKeyIfLegal(int keyCode) { + private boolean addKeyIfLegal(int keyCode) + { // If we're in 24hour mode, we'll need to check if the input is full. If in AM/PM mode, // we'll need to see if AM/PM have been typed. if ((mIs24HourMode && mTypedTimes.size() == 4) || @@ -617,7 +664,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue * Traverse the tree to see if the keys that have been typed so far are legal as is, * or may become legal as more keys are typed (excluding backspace). */ - private boolean isTypedTimeLegalSoFar() { + private boolean isTypedTimeLegalSoFar() + { Node node = mLegalTimesTree; for (int keyCode : mTypedTimes) { node = node.canReach(keyCode); @@ -631,7 +679,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue /** * Check if the time that has been typed so far is completely legal, as is. */ - private boolean isTypedTimeFullyLegal() { + private boolean isTypedTimeFullyLegal() + { if (mIs24HourMode) { // For 24-hour mode, the time is legal if the hours and minutes are each legal. Note: // getEnteredTime() will ONLY call isTypedTimeFullyLegal() when NOT in 24hour mode. @@ -645,7 +694,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } } - private int deleteLastTypedKey() { + private int deleteLastTypedKey() + { int deleted = mTypedTimes.remove(mTypedTimes.size() - 1); if (!isTypedTimeFullyLegal()) { mDoneButton.setEnabled(false); @@ -655,9 +705,11 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue /** * Get out of keyboard mode. If there is nothing in typedTimes, revert to TimePicker's time. + * * @param changeDisplays If true, update the displays with the relevant time. */ - private void finishKbMode(boolean updateDisplays) { + private void finishKbMode(boolean updateDisplays) + { mInKbMode = false; if (!mTypedTimes.isEmpty()) { int values[] = getEnteredTime(null); @@ -677,29 +729,31 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue * Update the hours, minutes, and AM/PM displays with the typed times. If the typedTimes is * empty, either show an empty display (filled with the placeholder text), or update from the * timepicker's values. + * * @param allowEmptyDisplay if true, then if the typedTimes is empty, use the placeholder text. - * Otherwise, revert to the timepicker's values. + * Otherwise, revert to the timepicker's values. */ - private void updateDisplay(boolean allowEmptyDisplay) { + private void updateDisplay(boolean allowEmptyDisplay) + { if (!allowEmptyDisplay && mTypedTimes.isEmpty()) { int hour = mTimePicker.getHours(); int minute = mTimePicker.getMinutes(); setHour(hour, true); setMinute(minute); if (!mIs24HourMode) { - updateAmPmDisplay(hour < 12? AM : PM); + updateAmPmDisplay(hour < 12 ? AM : PM); } setCurrentItemShowing(mTimePicker.getCurrentItemShowing(), true, true, true); mDoneButton.setEnabled(true); } else { Boolean[] enteredZeros = {false, false}; int[] values = getEnteredTime(enteredZeros); - String hourFormat = enteredZeros[0]? "%02d" : "%2d"; - String minuteFormat = (enteredZeros[1])? "%02d" : "%2d"; - String hourStr = (values[0] == -1)? mDoublePlaceholderText : - String.format(hourFormat, values[0]).replace(' ', mPlaceholderText); - String minuteStr = (values[1] == -1)? mDoublePlaceholderText : - String.format(minuteFormat, values[1]).replace(' ', mPlaceholderText); + String hourFormat = enteredZeros[0] ? "%02d" : "%2d"; + String minuteFormat = (enteredZeros[1]) ? "%02d" : "%2d"; + String hourStr = (values[0] == -1) ? mDoublePlaceholderText : + String.format(hourFormat, values[0]).replace(' ', mPlaceholderText); + String minuteStr = (values[1] == -1) ? mDoublePlaceholderText : + String.format(minuteFormat, values[1]).replace(' ', mPlaceholderText); mHourView.setText(hourStr); mHourSpaceView.setText(hourStr); mHourView.setTextColor(mUnselectedColor); @@ -712,7 +766,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } } - private static int getValFromKeyCode(int keyCode) { + private static int getValFromKeyCode(int keyCode) + { switch (keyCode) { case KeyEvent.KEYCODE_0: return 0; @@ -741,20 +796,22 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue /** * Get the currently-entered time, as integer values of the hours and minutes typed. + * * @param enteredZeros A size-2 boolean array, which the caller should initialize, and which - * may then be used for the caller to know whether zeros had been explicitly entered as either - * hours of minutes. This is helpful for deciding whether to show the dashes, or actual 0's. + * may then be used for the caller to know whether zeros had been explicitly entered as either + * hours of minutes. This is helpful for deciding whether to show the dashes, or actual 0's. * @return A size-3 int array. The first value will be the hours, the second value will be the * minutes, and the third will be either TimePickerDialog.AM or TimePickerDialog.PM. */ - private int[] getEnteredTime(Boolean[] enteredZeros) { + private int[] getEnteredTime(Boolean[] enteredZeros) + { int amOrPm = -1; int startIndex = 1; if (!mIs24HourMode && isTypedTimeFullyLegal()) { int keyCode = mTypedTimes.get(mTypedTimes.size() - 1); if (keyCode == getAmOrPmKeyCode(AM)) { amOrPm = AM; - } else if (keyCode == getAmOrPmKeyCode(PM)){ + } else if (keyCode == getAmOrPmKeyCode(PM)) { amOrPm = PM; } startIndex = 2; @@ -765,15 +822,15 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue int val = getValFromKeyCode(mTypedTimes.get(mTypedTimes.size() - i)); if (i == startIndex) { minute = val; - } else if (i == startIndex+1) { - minute += 10*val; + } else if (i == startIndex + 1) { + minute += 10 * val; if (enteredZeros != null && val == 0) { enteredZeros[1] = true; } - } else if (i == startIndex+2) { + } else if (i == startIndex + 2) { hour = val; - } else if (i == startIndex+3) { - hour += 10*val; + } else if (i == startIndex + 3) { + hour += 10 * val; if (enteredZeros != null && val == 0) { enteredZeros[0] = true; } @@ -787,7 +844,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue /** * Get the keycode value for AM and PM in the current language. */ - private int getAmOrPmKeyCode(int amOrPm) { + private int getAmOrPmKeyCode(int amOrPm) + { // Cache the codes. if (mAmKeyCode == -1 || mPmKeyCode == -1) { // Find the first character in the AM/PM text that is unique. @@ -822,7 +880,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue /** * Create a tree for deciding what keys can legally be typed. */ - private void generateLegalTimesTree() { + private void generateLegalTimesTree() + { // Create a quick cache of numbers to their keycodes. int k0 = KeyEvent.KEYCODE_0; int k1 = KeyEvent.KEYCODE_1; @@ -955,20 +1014,24 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue * mLegalKeys represents the keys that can be typed to get to the node. * mChildren are the children that can be reached from this node. */ - private class Node { + private class Node + { private int[] mLegalKeys; private ArrayList mChildren; - public Node(int... legalKeys) { + public Node(int... legalKeys) + { mLegalKeys = legalKeys; mChildren = new ArrayList(); } - public void addChild(Node child) { + public void addChild(Node child) + { mChildren.add(child); } - public boolean containsKey(int key) { + public boolean containsKey(int key) + { for (int i = 0; i < mLegalKeys.length; i++) { if (mLegalKeys[i] == key) { return true; @@ -977,7 +1040,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue return false; } - public Node canReach(int key) { + public Node canReach(int key) + { if (mChildren == null) { return null; } @@ -990,9 +1054,11 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } } - private class KeyboardListener implements OnKeyListener { + private class KeyboardListener implements OnKeyListener + { @Override - public boolean onKey(View v, int keyCode, KeyEvent event) { + public boolean onKey(View v, int keyCode, KeyEvent event) + { if (event.getAction() == KeyEvent.ACTION_UP) { return processKeyUp(keyCode); } @@ -1000,14 +1066,16 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue } } - public void setDismissListener( DialogInterface.OnDismissListener listener ) { + public void setDismissListener(DialogInterface.OnDismissListener listener) + { dismissListener = listener; } @Override - public void onDismiss(DialogInterface dialog) { + public void onDismiss(DialogInterface dialog) + { super.onDismiss(dialog); - if( dismissListener != null ) + if (dismissListener != null) dismissListener.onDismiss(dialog); } } diff --git a/android/android-pickers/src/main/res/layout/time_picker_dialog.xml b/android/android-pickers/src/main/res/layout/time_picker_dialog.xml index 44393dca6..cefb56099 100644 --- a/android/android-pickers/src/main/res/layout/time_picker_dialog.xml +++ b/android/android-pickers/src/main/res/layout/time_picker_dialog.xml @@ -49,33 +49,33 @@ android:layout_height="1dip" android:background="@color/line_background" /> - -