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

Commit dffe6fdf authored by Ian Lake's avatar Ian Lake
Browse files

Move expensive TextClock operations to onAttach

Registering and unregistering are expensive operations
that should not be done when the visibility of the
TextClock changes. However, we want to ensure that a
non-visible TextClock does not consume extra resources
or cause layout/redraw passes. By keeping the TextClock
registered but avoiding the side effects of onTimeChanged,
we can get the best of both worlds.

Test: manual testing

BUG: 33960344
Change-Id: I3e76246d820363766b78130231d665989fdb4265
parent 8aa30c04
Loading
Loading
Loading
Loading
+46 −18
Original line number Diff line number Diff line
@@ -132,7 +132,7 @@ public class TextClock extends TextView {

    private CharSequence mDescFormat;

    private boolean mRegistered;
    private boolean mAttached;

    private Calendar mTime;
    private String mTimeZone;
@@ -252,7 +252,7 @@ public class TextClock extends TextView {
        }

        createTime(mTimeZone);
        // Wait until registering for events to handle the ticker
        // Wait until onAttachedToWindow() to handle the ticker
        chooseFormat(false);
    }

@@ -503,9 +503,12 @@ public class TextClock extends TextView {
        boolean hadSeconds = mHasSeconds;
        mHasSeconds = DateFormat.hasSeconds(mFormat);

        if (handleTicker && mRegistered && hadSeconds != mHasSeconds) {
            if (hadSeconds) getHandler().removeCallbacks(mTicker);
            else mTicker.run();
        if (handleTicker && mAttached && hadSeconds != mHasSeconds) {
            if (hadSeconds) {
                getHandler().removeCallbacks(mTicker);
            } else if (getVisibility() == VISIBLE) {
                mTicker.run();
            }
        }
    }

@@ -517,27 +520,50 @@ public class TextClock extends TextView {
    }

    @Override
    public void onVisibilityAggregated(boolean isVisible) {
        if (!mRegistered && isVisible) {
            mRegistered = true;
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();

        if (!mAttached) {
            mAttached = true;

            registerReceiver();
            registerObserver();

            createTime(mTimeZone);

            if (getVisibility() == VISIBLE) {
                if (mHasSeconds) {
                    mTicker.run();
                } else {
                    onTimeChanged();
                }
        } else if (mRegistered && !isVisible) {
            }
        }
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();

        if (mAttached) {
            unregisterReceiver();
            unregisterObserver();

            getHandler().removeCallbacks(mTicker);

            mRegistered = false;
            mAttached = false;
        }
    }

    @Override
    public void onVisibilityAggregated(boolean isVisible) {
        if (mAttached) {
            if (isVisible && mHasSeconds) {
                mTicker.run();
            } else {
                getHandler().removeCallbacks(mTicker);
            }
            onTimeChanged();
        }
    }

@@ -560,7 +586,7 @@ public class TextClock extends TextView {
    }

    private void registerObserver() {
        if (mRegistered) {
        if (mAttached) {
            if (mFormatChangeObserver == null) {
                mFormatChangeObserver = new FormatChangeObserver(getHandler());
            }
@@ -587,10 +613,12 @@ public class TextClock extends TextView {
    }

    private void onTimeChanged() {
        if (getVisibility() == VISIBLE) {
            mTime.setTimeInMillis(System.currentTimeMillis());
            setText(DateFormat.format(mFormat, mTime));
            setContentDescription(DateFormat.format(mDescFormat, mTime));
        }
    }

    /** @hide */
    @Override