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

Commit bb566ca4 authored by Fabian Kozynski's avatar Fabian Kozynski
Browse files

Fix clipping of SecondaryLabel on animation

With this CL, the label container in collapsed tiles will be measured
with vertical MeasureSpec.UNSPECIFIED. That will make sure that the
labels take as much space as necessary.

In collapsed, the secondary label is not seen, but it's measured after
the available space is given to the first one and results in a line
that's not high enough. Using UNSPECIFIED makes sure that it gets as
much space as it needs. The total height of the label container is not a
problem since we know that the visible contents in the tiles will always
fit (after accounting for paddings).

Test: manual, also using high text size
Fixes: 187485111
Change-Id: Ida0d05a44d0722e85dc77018b5b2eabe334d47b2
parent 7aafe8e0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -383,6 +383,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha
                    mOtherTilesExpandAnimator.addView(tileView);
                    tileView.setClipChildren(true);
                    tileView.setClipToPadding(true);
                    firstPageBuilder.addFloat(tileView.getSecondaryLabel(), "alpha", 0, 1);
                }

                mAllViews.add(tileView);
+15 −2
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ import android.widget.LinearLayout
/**
 * [LinearLayout] that can ignore the last child for measuring.
 *
 * The view is measured as regularlt, then if [ignoreLastView] is true:
 * The view is measured as regularly, then if [ignoreLastView] is true:
 * * In [LinearLayout.VERTICAL] orientation, the height of the last view is subtracted from the
 * final measured height.
 * * In [LinearLayout.HORIZONTAL] orientation, the width of the last view is subtracted from the
@@ -41,8 +41,21 @@ class IgnorableChildLinearLayout @JvmOverloads constructor(

    var ignoreLastView = false

    /**
     * Forces [MeasureSpec.UNSPECIFIED] in the direction of layout
     */
    var forceUnspecifiedMeasure = false

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        val actualWidthSpec = if (forceUnspecifiedMeasure && orientation == HORIZONTAL) {
            MeasureSpec.makeMeasureSpec(widthMeasureSpec, MeasureSpec.UNSPECIFIED)
        } else widthMeasureSpec

        val actualHeightSpec = if (forceUnspecifiedMeasure && orientation == VERTICAL) {
            MeasureSpec.makeMeasureSpec(heightMeasureSpec, MeasureSpec.UNSPECIFIED)
        } else heightMeasureSpec

        super.onMeasure(actualWidthSpec, actualHeightSpec)
        if (ignoreLastView && childCount > 0) {
            val lastView = getChildAt(childCount - 1)
            if (lastView.visibility != GONE) {
+5 −0
Original line number Diff line number Diff line
@@ -189,6 +189,11 @@ open class QSTileViewImpl @JvmOverloads constructor(
        secondaryLabel = labelContainer.requireViewById(R.id.app_label)
        if (collapsed) {
            labelContainer.ignoreLastView = true
            // Ideally, it'd be great if the parent could set this up when measuring just this child
            // instead of the View class having to support this. However, due to the mysteries of
            // LinearLayout's double measure pass, we cannot overwrite `measureChild` or any of its
            // sibling methods to have special behavior for labelContainer.
            labelContainer.forceUnspecifiedMeasure = true
            secondaryLabel.alpha = 0f
            // Do not marque in QQS
            label.ellipsize = TextUtils.TruncateAt.END