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
This commit is contained in:
Fabian Kozynski
2021-07-01 13:50:18 -04:00
parent 7aafe8e0d1
commit bb566ca42e
3 changed files with 21 additions and 2 deletions

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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