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

Commit 6c8fef7f authored by Chet Haase's avatar Chet Haase
Browse files

Avoid null-deref crashes in ScrollBarDrawable

Some of the code in ScrollBarDrawable automatically derefs
the horizontal and/or vertical thumb objects. The drawable can
sometimes be in a state where these objects are null, causing
a null deref. This fix simply avoids dereferencing null objects.

Also, fixed doc bug in attrs.xml for Transition tags.

Issue #13210554 Transition style documentation refers to 'move' instead of 'changeBounds'
Issue #15636059 ScrollBarDrawable crashes in setAlpha() and other methods when thumbs are null

Change-Id: I6664ba17dae0845de8a8658381ae6e9c9ef99214
parent 5cdd1cc1
Loading
Loading
Loading
Loading
+26 −14
Original line number Diff line number Diff line
@@ -173,15 +173,19 @@ public class ScrollBarDrawable extends Drawable {
        }

        if (vertical) {
            if (mVerticalThumb != null) {
                final Drawable thumb = mVerticalThumb;
                if (changed) thumb.setBounds(thumbRect);
                thumb.draw(canvas);
            }
        } else {
            if (mHorizontalThumb != null) {
                final Drawable thumb = mHorizontalThumb;
                if (changed) thumb.setBounds(thumbRect);
                thumb.draw(canvas);
            }
        }
    }

    public void setVerticalThumbDrawable(Drawable thumb) {
        if (thumb != null) {
@@ -205,11 +209,11 @@ public class ScrollBarDrawable extends Drawable {

    public int getSize(boolean vertical) {
        if (vertical) {
            return (mVerticalTrack != null ?
                    mVerticalTrack : mVerticalThumb).getIntrinsicWidth();
            return mVerticalTrack != null ? mVerticalTrack.getIntrinsicWidth() :
                    mVerticalThumb != null ? mVerticalThumb.getIntrinsicWidth() : 0;
        } else {
            return (mHorizontalTrack != null ?
                    mHorizontalTrack : mHorizontalThumb).getIntrinsicHeight();
            return mHorizontalTrack != null ? mHorizontalTrack.getIntrinsicHeight() :
                    mHorizontalThumb != null ? mHorizontalThumb.getIntrinsicHeight() : 0;
        }
    }

@@ -218,12 +222,16 @@ public class ScrollBarDrawable extends Drawable {
        if (mVerticalTrack != null) {
            mVerticalTrack.setAlpha(alpha);
        }
        if (mVerticalThumb != null) {
            mVerticalThumb.setAlpha(alpha);
        }
        if (mHorizontalTrack != null) {
            mHorizontalTrack.setAlpha(alpha);
        }
        if (mHorizontalThumb != null) {
            mHorizontalThumb.setAlpha(alpha);
        }
    }

    @Override
    public int getAlpha() {
@@ -236,12 +244,16 @@ public class ScrollBarDrawable extends Drawable {
        if (mVerticalTrack != null) {
            mVerticalTrack.setColorFilter(cf);
        }
        if (mVerticalThumb != null) {
            mVerticalThumb.setColorFilter(cf);
        }
        if (mHorizontalTrack != null) {
            mHorizontalTrack.setColorFilter(cf);
        }
        if (mHorizontalThumb != null) {
            mHorizontalThumb.setColorFilter(cf);
        }
    }

    @Override
    public int getOpacity() {
+1 −1
Original line number Diff line number Diff line
@@ -5313,7 +5313,7 @@

    <!-- Use specific transition subclass names as the root tag of the XML resource that
         describes a {@link android.transition.Transition Transition},
         such as <code>move</code>, <code>fade</code>, and <code>set</code>. -->
         such as <code>changeBounds</code>, <code>fade</code>, and <code>transitionSet</code>. -->
    <declare-styleable name="Transition">
        <!-- Amount of time (in milliseconds) that the transition should run. -->
        <attr name="duration" />