Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2a993b4f authored by Alan Viverette's avatar Alan Viverette
Browse files

Maintain internal consistency for TimePickerClockDelegate hour

Hour was not updated correctly when a new hour was selected using the
radial picker or when AM/PM was changed, which prevented programmatic
calls from working.

Bug: 28398738
Change-Id: I0c1ffd9f9e569d980e72e74dc62568a56930afc4
parent 9de0f87e
Loading
Loading
Loading
Loading
+78 −59
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import android.widget.RadialTimePickerView.OnValueSelectedListener;

import com.android.internal.R;
import com.android.internal.widget.NumericTextView;
@@ -48,8 +49,7 @@ import java.util.Calendar;
/**
 * A delegate implementing the radial clock-based TimePicker.
 */
class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate implements
        RadialTimePickerView.OnValueSelectedListener {
class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate {
    /**
     * Delay in milliseconds before valid but potentially incomplete, for
     * example "1" but not "12", keyboard edits are propagated from the
@@ -88,8 +88,8 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl

    private boolean mIsEnabled = true;
    private boolean mAllowAutoAdvance;
    private int mInitialHourOfDay;
    private int mInitialMinute;
    private int mCurrentHour;
    private int mCurrentMinute;
    private boolean mIs24Hour;
    private boolean mIsAmPmAtStart;

@@ -189,8 +189,7 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl

        mRadialTimePickerView = (RadialTimePickerView) mainView.findViewById(R.id.radial_picker);
        mRadialTimePickerView.applyAttributes(attrs, defStyleAttr, defStyleRes);

        setupListeners();
        mRadialTimePickerView.setOnValueSelectedListener(mOnValueSelectedListener);

        mAllowAutoAdvance = true;

@@ -324,28 +323,24 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl
    }

    private void initialize(int hourOfDay, int minute, boolean is24HourView, int index) {
        mInitialHourOfDay = hourOfDay;
        mInitialMinute = minute;
        mCurrentHour = hourOfDay;
        mCurrentMinute = minute;
        mIs24Hour = is24HourView;
        updateUI(index);
    }

    private void setupListeners() {
        mRadialTimePickerView.setOnValueSelectedListener(this);
    }

    private void updateUI(int index) {
        updateHeaderAmPm();
        updateHeaderHour(mInitialHourOfDay, false);
        updateHeaderHour(mCurrentHour, false);
        updateHeaderSeparator();
        updateHeaderMinute(mInitialMinute, false);
        updateHeaderMinute(mCurrentMinute, false);
        updateRadialPicker(index);

        mDelegator.invalidate();
    }

    private void updateRadialPicker(int index) {
        mRadialTimePickerView.initialize(mInitialHourOfDay, mInitialMinute, mIs24Hour);
        mRadialTimePickerView.initialize(mCurrentHour, mCurrentMinute, mIs24Hour);
        setCurrentItemShowing(index, false, true);
    }

@@ -358,7 +353,7 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl
            final boolean isAmPmAtStart = dateTimePattern.startsWith("a");
            setAmPmAtStart(isAmPmAtStart);

            updateAmPmLabelStates(mInitialHourOfDay < 12 ? AM : PM);
            updateAmPmLabelStates(mCurrentHour < 12 ? AM : PM);
        }
    }

@@ -388,16 +383,26 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl
     */
    @Override
    public void setHour(int hour) {
        if (mInitialHourOfDay != hour) {
            mInitialHourOfDay = hour;
            updateHeaderHour(hour, true);
        setHourInternal(hour, false, true);
    }

    private void setHourInternal(int hour, boolean isFromPicker, boolean announce) {
        if (mCurrentHour == hour) {
            return;
        }

        mCurrentHour = hour;
        updateHeaderHour(hour, announce);
        updateHeaderAmPm();

        if (!isFromPicker) {
            mRadialTimePickerView.setCurrentHour(hour);
            mRadialTimePickerView.setAmOrPm(mInitialHourOfDay < 12 ? AM : PM);
            mRadialTimePickerView.setAmOrPm(hour < 12 ? AM : PM);
        }

        mDelegator.invalidate();
        onTimeChanged();
    }
    }

    /**
     * @return the current hour in the range (0-23)
@@ -421,14 +426,24 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl
     */
    @Override
    public void setMinute(int minute) {
        if (mInitialMinute != minute) {
            mInitialMinute = minute;
        setMinuteInternal(minute, false);
    }

    private void setMinuteInternal(int minute, boolean isFromPicker) {
        if (mCurrentMinute == minute) {
            return;
        }

        mCurrentMinute = minute;
        updateHeaderMinute(minute, true);

        if (!isFromPicker) {
            mRadialTimePickerView.setCurrentMinute(minute);
        }

        mDelegator.invalidate();
        onTimeChanged();
    }
    }

    /**
     * @return The current minute.
@@ -448,7 +463,7 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl
    public void setIs24Hour(boolean is24Hour) {
        if (mIs24Hour != is24Hour) {
            mIs24Hour = is24Hour;
            mInitialHourOfDay = getHour();
            mCurrentHour = getHour();

            updateHourFormat();
            updateUI(mRadialTimePickerView.getCurrentItemShowing());
@@ -562,34 +577,6 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl
        mPmLabel.setChecked(isPm);
    }

    /**
     * Called by the picker for updating the header display.
     */
    @Override
    public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) {
        switch (pickerIndex) {
            case HOUR_INDEX:
                if (mAllowAutoAdvance && autoAdvance) {
                    updateHeaderHour(newValue, false);
                    setCurrentItemShowing(MINUTE_INDEX, true, false);
                    mDelegator.announceForAccessibility(newValue + ". " + mSelectMinutes);
                } else {
                    updateHeaderHour(newValue, true);
                }
                break;
            case MINUTE_INDEX:
                updateHeaderMinute(newValue, true);
                break;
            case AMPM_INDEX:
                updateAmPmLabelStates(newValue);
                break;
        }

        if (mOnTimeChangedListener != null) {
            mOnTimeChangedListener.onTimeChanged(mDelegator, getHour(), getMinute());
        }
    }

    /**
     * Converts hour-of-day (0-23) time into a localized hour number.
     * <p>
@@ -702,11 +689,43 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate impl
    private void setAmOrPm(int amOrPm) {
        updateAmPmLabelStates(amOrPm);

        if (mRadialTimePickerView.setAmOrPm(amOrPm) && mOnTimeChangedListener != null) {
        if (mRadialTimePickerView.setAmOrPm(amOrPm)) {
            mCurrentHour = getHour();

            if (mOnTimeChangedListener != null) {
                mOnTimeChangedListener.onTimeChanged(mDelegator, getHour(), getMinute());
            }
        }
    }

    /** Listener for RadialTimePickerView interaction. */
    private final OnValueSelectedListener mOnValueSelectedListener = new OnValueSelectedListener() {
        @Override
        public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) {
            switch (pickerIndex) {
                case HOUR_INDEX:
                    final boolean isTransition = mAllowAutoAdvance && autoAdvance;
                    setHourInternal(newValue, true, !isTransition);
                    if (isTransition) {
                        setCurrentItemShowing(MINUTE_INDEX, true, false);
                        mDelegator.announceForAccessibility(newValue + ". " + mSelectMinutes);
                    }
                    break;
                case MINUTE_INDEX:
                    setMinuteInternal(newValue, true);
                    break;
                case AMPM_INDEX:
                    updateAmPmLabelStates(newValue);
                    break;
            }

            if (mOnTimeChangedListener != null) {
                mOnTimeChangedListener.onTimeChanged(mDelegator, getHour(), getMinute());
            }
        }
    };

    /** Listener for keyboard interaction. */
    private final OnValueChangedListener mDigitEnteredListener = new OnValueChangedListener() {
        @Override
        public void onValueChanged(NumericTextView view, int value,