diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/GridSelectorLayout.java b/app/src/main/java/com/philliphsu/clock2/editalarm/GridSelectorLayout.java index ad1f918..631f6a9 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/GridSelectorLayout.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/GridSelectorLayout.java @@ -112,18 +112,6 @@ public class GridSelectorLayout extends ViewAnimator implements NumbersGrid.OnNu setValueForItem(HOUR_INDEX, initialHoursOfDay); setValueForItem(MINUTE_INDEX, initialMinutes); - // Record the selected values in the number grids. - if (!is24HourMode) { - initialHoursOfDay = initialHoursOfDay % 12; - if (initialHoursOfDay == 0) { - initialHoursOfDay = 12; - } - mHoursGrid.setSelection(initialHoursOfDay); - } else { - m24HoursGrid.setSelection(initialHoursOfDay); - } - mMinutesGrid.setSelection(initialMinutes); - mTimeInitialized = true; } @@ -131,7 +119,6 @@ public class GridSelectorLayout extends ViewAnimator implements NumbersGrid.OnNu // TODO: This logic needs to be in the Dialog class, since the am/pm view is contained there. // mAmPmView.setTheme(context, themeDark); - // TODO: These aren't doing much currently, if at all. if (m24HoursGrid != null) { m24HoursGrid.setTheme(context, themeDark); } else if (mHoursGrid != null) { @@ -141,25 +128,8 @@ public class GridSelectorLayout extends ViewAnimator implements NumbersGrid.OnNu } public void setTime(int hours, int minutes) { - setItem(HOUR_INDEX, hours); - setItem(MINUTE_INDEX, minutes); - } - - /** - * Set either the hour or the minute. Will set the internal value, and set the selection. - */ - private void setItem(int index, int value) { - if (index == HOUR_INDEX) { - setValueForItem(HOUR_INDEX, value); - if (mIs24HourMode) { - m24HoursGrid.setSelection(value); - } else { - mHoursGrid.setSelection(value); - } - } else if (index == MINUTE_INDEX) { - setValueForItem(MINUTE_INDEX, value); - mMinutesGrid.setSelection(value); - } + setValueForItem(HOUR_INDEX, hours); + setValueForItem(MINUTE_INDEX, minutes); } public void setOnValueSelectedListener(OnValueSelectedListener listener) { @@ -301,16 +271,32 @@ public class GridSelectorLayout extends ViewAnimator implements NumbersGrid.OnNu * Set the internal value for the hour, minute, or AM/PM. */ private void setValueForItem(int index, int value) { + Log.d(TAG, String.format("setValueForItem(%d, %d)", index, value)); if (index == HOUR_INDEX) { mCurrentHoursOfDay = value; + setHourGridSelection(value); } else if (index == MINUTE_INDEX){ mCurrentMinutes = value; + mMinutesGrid.setSelection(value); } else if (index == AMPM_INDEX) { if (value == HALF_DAY_1) { mCurrentHoursOfDay = mCurrentHoursOfDay % 12; } else if (value == HALF_DAY_2) { mCurrentHoursOfDay = (mCurrentHoursOfDay % 12) + 12; } + setHourGridSelection(mCurrentHoursOfDay); + } + } + + private void setHourGridSelection(int value) { + if (mIs24HourMode) { + m24HoursGrid.setSelection(value); + } else { + value = value % 12; + if (value == 0) { + value = 12; + } + mHoursGrid.setSelection(value); } } } diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/HoursGrid.java b/app/src/main/java/com/philliphsu/clock2/editalarm/HoursGrid.java index 372b916..db01f1c 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/HoursGrid.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/HoursGrid.java @@ -13,6 +13,14 @@ public class HoursGrid extends NumbersGrid { super(context); } + @Override + public void setSelection(int value) { + super.setSelection(value); + // We expect value to be within [1, 12]. The position in the grid where + // value is located is thus (value - 1). + setIndicator(getChildAt(value - 1)); + } + @Override protected int contentLayout() { return R.layout.content_hours_grid; diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/MinutesGrid.java b/app/src/main/java/com/philliphsu/clock2/editalarm/MinutesGrid.java index 57de40a..d1238e1 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/MinutesGrid.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/MinutesGrid.java @@ -28,7 +28,7 @@ public class MinutesGrid extends NumbersGrid { int value = getSelection() - 1; if (value < 0) value = 59; - setIndicator(value); + setIndicator(value); // TODO: Remove when you move this logic to setSelection() setSelection(value); mSelectionListener.onNumberSelected(value); } @@ -39,7 +39,7 @@ public class MinutesGrid extends NumbersGrid { int value = getSelection() + 1; if (value == 60) value = 0; - setIndicator(value); + setIndicator(value); // TODO: Remove when you move this logic to setSelection() setSelection(value); mSelectionListener.onNumberSelected(value); } @@ -75,8 +75,9 @@ public class MinutesGrid extends NumbersGrid { * Helper method for minute tuners to set the indicator. * @param value the new value set by the minute tuners */ + // TODO: Move this logic to setSelection() private void setIndicator(int value) { - clearIndicator(); + clearIndicator(); // TODO: Remove? if (value % 5 == 0) { // The new value is one of the predetermined minute values int positionOfValue = value / 5; diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/NumbersGrid.java b/app/src/main/java/com/philliphsu/clock2/editalarm/NumbersGrid.java index 5be57cf..1df8f95 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/NumbersGrid.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/NumbersGrid.java @@ -46,15 +46,15 @@ public abstract class NumbersGrid extends GridLayout implements View.OnClickList // our subclasses' buttons, if any. registerClickListeners(); mIsInitialized = false; -// mDefaultTextColor = Utils.getTextColorFromThemeAttr(context, android.R.attr.textColorPrimary); mDefaultTextColor = ContextCompat.getColor(context, R.color.text_color_primary_light); // The reason we can use the Context passed here and get the correct accent color // is that this NumbersGrid is programmatically created by the GridSelectorLayout in // its initialize(), and the Context passed in there is from // NumberGridTimePickerDialog.getActivity(). mSelectedTextColor = Utils.getThemeAccentColor(context); - // Show the first button as default selected - setIndicator(getChildAt(indexOfDefaultValue())); + final View defaultSelectedView = getChildAt(indexOfDefaultValue()); + mSelection = valueOf(defaultSelectedView); + setIndicator(defaultSelectedView); } public void initialize(OnNumberSelectedListener listener) { @@ -81,10 +81,8 @@ public abstract class NumbersGrid extends GridLayout implements View.OnClickList */ @Override public void onClick(View v) { - TextView tv = (TextView) v; - clearIndicator(); // Does nothing if there was no indicator last selected setIndicator(v); - mSelection = Integer.parseInt(tv.getText().toString()); + mSelection = valueOf(v); mSelectionListener.onNumberSelected(mSelection); } @@ -108,6 +106,7 @@ public abstract class NumbersGrid extends GridLayout implements View.OnClickList * @param view the clicked number button */ protected void setIndicator(View view) { + clearIndicator(); // Does nothing if there was no indicator last selected TextView tv = (TextView) view; tv.setTextColor(mSelectedTextColor); mLastSelectedView = view; @@ -138,22 +137,21 @@ public abstract class NumbersGrid extends GridLayout implements View.OnClickList * as determined by {@link #canRegisterClickListener(View)}. */ void setTheme(Context context, boolean themeDark) { -// mDefaultTextColor = Utils.getTextColorFromThemeAttr(context, themeDark? -// // You may think the order should be switched, but this is in fact the correct order. -// // I'm guessing this is sensitive to the background color? -// android.R.attr.textColorPrimary : android.R.attr.textColorPrimaryInverse); mDefaultTextColor = ContextCompat.getColor(context, themeDark? R.color.text_color_primary_dark : R.color.text_color_primary_light); for (int i = 0; i < getChildCount(); i++) { View v = getChildAt(i); + // TODO: We can move this to the ctor, because this isn't dependent on the theme. Utils.setColorControlHighlight(v, mSelectedTextColor/*colorAccent*/); // Filter out views that aren't number buttons if (canRegisterClickListener(v)) { - ((TextView) v).setTextColor(mDefaultTextColor); + final TextView tv = (TextView) v; + // Filter out the current selection + if (mSelection != valueOf(tv)) { + tv.setTextColor(mDefaultTextColor); + } } } - // Set the indicator again - setIndicator(getChildAt(indexOfDefaultValue())); } /** @@ -169,4 +167,11 @@ public abstract class NumbersGrid extends GridLayout implements View.OnClickList i++; } } + + /** + * Parses the number held by the button into an integer. + */ + private static int valueOf(View button) { + return Integer.parseInt(((TextView) button).getText().toString()); + } } diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/TwentyFourHoursGrid.java b/app/src/main/java/com/philliphsu/clock2/editalarm/TwentyFourHoursGrid.java index db851b5..b8f235d 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/TwentyFourHoursGrid.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/TwentyFourHoursGrid.java @@ -39,7 +39,7 @@ public class TwentyFourHoursGrid extends NumbersGrid implements View.OnLongClick // We already verified that this view can have a click listener registered on. // See canRegisterClickListener(). TwentyFourHourGridItem item = (TwentyFourHourGridItem) v; - clearIndicator(); + clearIndicator(); // TODO: Remove? setIndicator(v); int newVal = Integer.parseInt(item.getPrimaryText().toString()); setSelection(newVal); @@ -52,7 +52,7 @@ public class TwentyFourHoursGrid extends NumbersGrid implements View.OnLongClick int newVal = Integer.parseInt(item.getSecondaryText().toString()); setSelection(newVal); mSelectionListener.onNumberSelected(newVal); - clearIndicator(); + clearIndicator(); // TODO: Remove? swapTexts(); // TOneverDO: Call before swapping texts, because setIndicator() uses the primary TextView. setIndicator(v); @@ -90,7 +90,7 @@ public class TwentyFourHoursGrid extends NumbersGrid implements View.OnLongClick item.getSecondaryTextView().setTextColor(mSecondaryTextColor); } // Set the indicator again - setIndicator(getChildAt(indexOfDefaultValue())); + setIndicator(getChildAt(indexOfDefaultValue())); // TODO: We don't need this anymore. } public void swapTexts() {