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:
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user