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

Commit ec6a4cde authored by Doris Liu's avatar Doris Liu
Browse files

Fix logic for whether beginning/end divider should be drawn

Bug: 18945384
Change-Id: Ib8e785cb97d288e39a39b968bcb9c05410acbe34
parent 728b7500
Loading
Loading
Loading
Loading
+36 −14
Original line number Original line Diff line number Diff line
@@ -359,7 +359,7 @@ public class LinearLayout extends ViewGroup {
        }
        }


        if (hasDividerBeforeChildAt(count)) {
        if (hasDividerBeforeChildAt(count)) {
            final View child = getVirtualChildAt(count - 1);
            final View child = getLastNonGoneChild();
            int bottom = 0;
            int bottom = 0;
            if (child == null) {
            if (child == null) {
                bottom = getHeight() - getPaddingBottom() - mDividerHeight;
                bottom = getHeight() - getPaddingBottom() - mDividerHeight;
@@ -371,6 +371,20 @@ public class LinearLayout extends ViewGroup {
        }
        }
    }
    }


    /**
     * Finds the last child that is not gone. The last child will be used as the reference for
     * where the end divider should be drawn.
     */
    private View getLastNonGoneChild() {
        for (int i = getVirtualChildCount() - 1; i >= 0; i--) {
            View child = getVirtualChildAt(i);
            if (child != null && child.getVisibility() != GONE) {
                return child;
            }
        }
        return null;
    }

    void drawDividersHorizontal(Canvas canvas) {
    void drawDividersHorizontal(Canvas canvas) {
        final int count = getVirtualChildCount();
        final int count = getVirtualChildCount();
        final boolean isLayoutRtl = isLayoutRtl();
        final boolean isLayoutRtl = isLayoutRtl();
@@ -392,7 +406,7 @@ public class LinearLayout extends ViewGroup {
        }
        }


        if (hasDividerBeforeChildAt(count)) {
        if (hasDividerBeforeChildAt(count)) {
            final View child = getVirtualChildAt(count - 1);
            final View child = getLastNonGoneChild();
            int position;
            int position;
            if (child == null) {
            if (child == null) {
                if (isLayoutRtl) {
                if (isLayoutRtl) {
@@ -627,22 +641,30 @@ public class LinearLayout extends ViewGroup {
     * @hide Pending API consideration. Currently only used internally by the system.
     * @hide Pending API consideration. Currently only used internally by the system.
     */
     */
    protected boolean hasDividerBeforeChildAt(int childIndex) {
    protected boolean hasDividerBeforeChildAt(int childIndex) {
        if (childIndex == 0) {
        if (childIndex == getVirtualChildCount()) {
            return (mShowDividers & SHOW_DIVIDER_BEGINNING) != 0;
            // Check whether the end divider should draw.
        } else if (childIndex == getChildCount()) {
            return (mShowDividers & SHOW_DIVIDER_END) != 0;
            return (mShowDividers & SHOW_DIVIDER_END) != 0;
        } else if ((mShowDividers & SHOW_DIVIDER_MIDDLE) != 0) {
            boolean hasVisibleViewBefore = false;
            for (int i = childIndex - 1; i >= 0; i--) {
                if (getChildAt(i).getVisibility() != GONE) {
                    hasVisibleViewBefore = true;
                    break;
        }
        }
        boolean allViewsAreGoneBefore = allViewsAreGoneBefore(childIndex);
        if (allViewsAreGoneBefore) {
            // This is the first view that's not gone, check if beginning divider is enabled.
            return (mShowDividers & SHOW_DIVIDER_BEGINNING) != 0;
        } else {
            return (mShowDividers & SHOW_DIVIDER_MIDDLE) != 0;
        }
        }
            return hasVisibleViewBefore;
    }
    }

    /**
     * Checks whether all (virtual) child views before the given index are gone.
     */
    private boolean allViewsAreGoneBefore(int childIndex) {
        for (int i = childIndex - 1; i >= 0; i--) {
            if (getVirtualChildAt(i).getVisibility() != GONE) {
                return false;
                return false;
            }
            }
        }
        return true;
    }


    /**
    /**
     * Measures the children when the orientation of this LinearLayout is set
     * Measures the children when the orientation of this LinearLayout is set