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

Commit a54cd38b authored by Alan Viverette's avatar Alan Viverette
Browse files

Layout layers without intrinsic dimensions using FILL gravity

Addresses a regression in Calendar where a custom drawable that doesn't
implement intrinsic bounds is laid out incorrectly. Also fixes an issue
where ColorDrawable would be laid out incorrectly.

Bug: 20643614
Change-Id: I796f0d3e189e482cf6fa169a5dd13f654d72653c
parent e658285b
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -1464,7 +1464,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
                    bounds.right - insetR - padR, bounds.bottom - r.mInsetB - padB);

            // Apply resolved gravity to drawable based on resolved size.
            final int gravity = resolveGravity(r.mGravity, r.mWidth, r.mHeight);
            final int gravity = resolveGravity(r.mGravity, r.mWidth, r.mHeight,
                    d.getIntrinsicWidth(), d.getIntrinsicHeight());
            final int w = r.mWidth < 0 ? d.getIntrinsicWidth() : r.mWidth;
            final int h = r.mHeight < 0 ? d.getIntrinsicHeight() : r.mHeight;
            Gravity.apply(gravity, w, h, container, outRect, layoutDirection);
@@ -1491,7 +1492,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
     * @param height height of the layer if set, -1 otherwise
     * @return the default gravity for the layer
     */
    private static int resolveGravity(int gravity, int width, int height) {
    private static int resolveGravity(int gravity, int width, int height,
            int intrinsicWidth, int intrinsicHeight) {
        if (!Gravity.isHorizontal(gravity)) {
            if (width < 0) {
                gravity |= Gravity.FILL_HORIZONTAL;
@@ -1508,6 +1510,17 @@ public class LayerDrawable extends Drawable implements Drawable.Callback {
            }
        }

        // If a dimension if not specified, either implicitly or explicitly,
        // force FILL for that dimension's gravity. This ensures that colors
        // are handled correctly and ensures backward compatibility.
        if (width < 0 && intrinsicWidth < 0) {
            gravity |= Gravity.FILL_HORIZONTAL;
        }

        if (height < 0 && intrinsicHeight < 0) {
            gravity |= Gravity.FILL_VERTICAL;
        }

        return gravity;
    }