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

Commit 34562bcf authored by Bill Lin's avatar Bill Lin
Browse files

Fix QSTileViewImpl label set ellipsize performance issue

health/microbench/systemui/systemui-latency-suite regress
wake & unlock time : +50ms

Root cuase: TextView.setEllipsize() overhead is high, and
the overhead x QSTileView numbers would obviously affect
the test latency time.

Solution:
By default we left tileView as Marquee but not setSelected(),
then we setSelected on tile views when QQS expanding until
proposedTranslation meet 1f(showing truncated at End with
'...' visualization)

Adding 3 major factors to achieve below state machine
1. Selected(T) : expansion == 1f or proposedTranslation < 0f
2. NoAction in transitioning : expansion > 0f or expansion < 1f
3. Signal when mLastHeaderTranslation != headerTranslation

The expansion state will be:
- init Collapsed : setSelected(true)
- Header expanding QQS : setSelected(false)
- QQS expanded : NoAction
- QQS -> Expanding QS : NoAction
- QS expanded : setSelected(true)
- QS Collapsing -> QQS : setSelected(true)
  or QS full collapsing : setSelected(true)
- QS collapsed in QQS : setSelected(false)
- Back to init state : setSelected(true)

Test: health/microbench/systemui/systemui-latency-suite
Test: Manual check QS/QQS long label tile
      QQS : ellipsize at end
      QS: Marquee
Test: SystemUITests
Bug: 192680464
Change-Id: Iebf1e84043501916dd90378973a6736135c9f653
parent 2d5cbc5d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -268,7 +268,7 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout {
    }

    @Override
    public void setExpansion(float expansion) {
    public void setExpansion(float expansion, float proposedTranslation) {
        mLastExpansion = expansion;
        updateSelected();
    }
+7 −5
Original line number Diff line number Diff line
@@ -491,11 +491,13 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
                            : headerTranslation);
        }
        int currentHeight = getView().getHeight();
        mLastHeaderTranslation = headerTranslation;
        if (expansion == mLastQSExpansion && mLastKeyguardAndExpanded == onKeyguardAndExpanded
                && mLastViewHeight == currentHeight) {
        if (expansion == mLastQSExpansion
                && mLastKeyguardAndExpanded == onKeyguardAndExpanded
                && mLastViewHeight == currentHeight
                && mLastHeaderTranslation == headerTranslation) {
            return;
        }
        mLastHeaderTranslation = headerTranslation;
        mLastQSExpansion = expansion;
        mLastKeyguardAndExpanded = onKeyguardAndExpanded;
        mLastViewHeight = currentHeight;
@@ -515,8 +517,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
        }
        mFooter.setExpansion(onKeyguardAndExpanded ? 1 : expansion);
        mQSPanelController.setRevealExpansion(expansion);
        mQSPanelController.getTileLayout().setExpansion(expansion);
        mQuickQSPanelController.getTileLayout().setExpansion(expansion);
        mQSPanelController.getTileLayout().setExpansion(expansion, proposedTranslation);
        mQuickQSPanelController.getTileLayout().setExpansion(expansion, proposedTranslation);
        mQSPanelScrollView.setTranslationY(translationScaleY * heightDiff);
        if (fullyCollapsed) {
            mQSPanelScrollView.setScrollY(0);
+6 −3
Original line number Diff line number Diff line
@@ -740,7 +740,7 @@ public class QSPanel extends LinearLayout implements Tunable {
        void setListening(boolean listening, UiEventLogger uiEventLogger);

        /**
         * Set the minimum number of rows to show
         * Sets the minimum number of rows to show
         *
         * @param minRows the minimum.
         */
@@ -749,7 +749,7 @@ public class QSPanel extends LinearLayout implements Tunable {
        }

        /**
         * Set the max number of columns to show
         * Sets the max number of columns to show
         *
         * @param maxColumns the maximum
         *
@@ -759,7 +759,10 @@ public class QSPanel extends LinearLayout implements Tunable {
            return false;
        }

        default void setExpansion(float expansion) {}
        /**
         * Sets the expansion value and proposedTranslation to panel.
         */
        default void setExpansion(float expansion, float proposedTranslation) {}

        int getNumVisibleTiles();
    }
+26 −0
Original line number Diff line number Diff line
@@ -177,6 +177,8 @@ public class QuickQSPanel extends QSPanel {

    static class QQSSideLabelTileLayout extends SideLabelTileLayout {

        private boolean mLastSelected;

        QQSSideLabelTileLayout(Context context) {
            super(context, null);
            setClipChildren(false);
@@ -222,5 +224,29 @@ public class QuickQSPanel extends QSPanel {
                }
            }
        }

        @Override
        public void setExpansion(float expansion, float proposedTranslation) {
            if (expansion > 0f && expansion < 1f) {
                return;
            }
            // The cases we must set select for marquee when QQS/QS collapsed, and QS full expanded.
            // Expansion == 0f is when QQS is fully showing (as opposed to 1f, which is QS). At this
            // point we want them to be selected so the tiles will marquee (but not at other points
            // of expansion.
            boolean selected = (expansion == 1f || proposedTranslation < 0f);
            if (mLastSelected == selected) {
                return;
            }
            // We set it as not important while we change this, so setting each tile as selected
            // will not cause them to announce themselves until the user has actually selected the
            // item.
            setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
            for (int i = 0; i < getChildCount(); i++) {
                getChildAt(i).setSelected(selected);
            }
            setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO);
            mLastSelected = selected;
        }
    }
}
+0 −3
Original line number Diff line number Diff line
@@ -195,9 +195,6 @@ open class QSTileViewImpl @JvmOverloads constructor(
            // sibling methods to have special behavior for labelContainer.
            labelContainer.forceUnspecifiedMeasure = true
            secondaryLabel.alpha = 0f
            // Do not marque in QQS
            label.ellipsize = TextUtils.TruncateAt.END
            secondaryLabel.ellipsize = TextUtils.TruncateAt.END
        }
        setLabelColor(getLabelColorForState(QSTile.State.DEFAULT_STATE))
        setSecondaryLabelColor(getSecondaryLabelColorForState(QSTile.State.DEFAULT_STATE))