From bb566ca42ea1c207c8cc5174a4f445fbbb8d1029 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Thu, 1 Jul 2021 13:50:18 -0400 Subject: [PATCH] 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 --- .../src/com/android/systemui/qs/QSAnimator.java | 1 + .../qs/tileimpl/IgnorableChildLinearLayout.kt | 17 +++++++++++++++-- .../systemui/qs/tileimpl/QSTileViewImpl.kt | 5 +++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java index 3f7a0e2bb3b9d..f44bfd3e040ad 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java @@ -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); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/IgnorableChildLinearLayout.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/IgnorableChildLinearLayout.kt index 2bac29846893d..56bf3d59f6482 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/IgnorableChildLinearLayout.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/IgnorableChildLinearLayout.kt @@ -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) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt index d31e67c557771..70685a68e182f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt @@ -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