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

Commit 28230e5e authored by Chet Haase's avatar Chet Haase
Browse files

Add targetSdk check around new LinearLayout weighted measure behavior

Bug: 73827180
Test: Existing CTS tests in LinearLayoutTest
Change-Id: I88dfde3743d0f954cd275be6a0032fe30ef55c03
parent c9dc4b8f
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -903,6 +903,8 @@ public class Build {
         * <li>{@link android.app.Service#startForeground Service.startForeground} requires
         * that apps hold the permission
         * {@link android.Manifest.permission#FOREGROUND_SERVICE}.</li>
         * <li>{@link android.widget.LinearLayout} will always remeasure weighted children,
         * even if there is no excess space.</li>
         * </ul>
         */
        public static final int P = CUR_DEVELOPMENT; // STOPSHIP Replace with the real version.
+24 −2
Original line number Diff line number Diff line
@@ -217,6 +217,17 @@ public class LinearLayout extends ViewGroup {

    private int mLayoutDirection = View.LAYOUT_DIRECTION_UNDEFINED;

    /**
     * Signals that compatibility booleans have been initialized according to
     * target SDK versions.
     */
    private static boolean sCompatibilityDone = false;

    /**
     * Behavior change in P; always remeasure weighted children, regardless of excess space.
     */
    private static boolean sRemeasureWeightedChildren = true;

    public LinearLayout(Context context) {
        this(context, null);
    }
@@ -232,6 +243,15 @@ public class LinearLayout extends ViewGroup {
    public LinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);

        if (!sCompatibilityDone && context != null) {
            final int targetSdkVersion = context.getApplicationInfo().targetSdkVersion;

            // Older apps only remeasure non-zero children
            sRemeasureWeightedChildren = targetSdkVersion >= Build.VERSION_CODES.P;

            sCompatibilityDone = true;
        }

        final TypedArray a = context.obtainStyledAttributes(
                attrs, com.android.internal.R.styleable.LinearLayout, defStyleAttr, defStyleRes);

@@ -917,7 +937,8 @@ public class LinearLayout extends ViewGroup {
        // measurement on any children, we need to measure them now.
        int remainingExcess = heightSize - mTotalLength
                + (mAllowInconsistentMeasurement ? 0 : consumedExcessSpace);
        if (skippedMeasure || totalWeight > 0.0f) {
        if (skippedMeasure
                || ((sRemeasureWeightedChildren || remainingExcess != 0) && totalWeight > 0.0f)) {
            float remainingWeightSum = mWeightSum > 0.0f ? mWeightSum : totalWeight;

            mTotalLength = 0;
@@ -1300,7 +1321,8 @@ public class LinearLayout extends ViewGroup {
        // measurement on any children, we need to measure them now.
        int remainingExcess = widthSize - mTotalLength
                + (mAllowInconsistentMeasurement ? 0 : usedExcessSpace);
        if (skippedMeasure || totalWeight > 0.0f) {
        if (skippedMeasure
                || ((sRemeasureWeightedChildren || remainingExcess != 0) && totalWeight > 0.0f)) {
            float remainingWeightSum = mWeightSum > 0.0f ? mWeightSum : totalWeight;

            maxAscent[0] = maxAscent[1] = maxAscent[2] = maxAscent[3] = -1;