/** * Updates the overlay-color rounding of the parent's child drawable. * * <ul> * <li>If rounding mode is OVERLAY_COLOR and the child is not a RoundedCornersDrawable, a new * RoundedCornersDrawable is created and the child gets wrapped with it. * <li>If rounding mode is OVERLAY_COLOR and the child is already wrapped with a * RoundedCornersDrawable, its rounding parameters are updated. * <li>If rounding mode is not OVERLAY_COLOR and the child is wrapped with a * RoundedCornersDrawable, the rounded drawable gets removed and its child gets attached * directly to the parent. * </ul> */ static void updateOverlayColorRounding( DrawableParent parent, @Nullable RoundingParams roundingParams) { Drawable child = parent.getDrawable(); if (roundingParams != null && roundingParams.getRoundingMethod() == RoundingParams.RoundingMethod.OVERLAY_COLOR) { // Overlay rounding requested - either update the overlay params or add a new // drawable that will do the requested rounding. if (child instanceof RoundedCornersDrawable) { RoundedCornersDrawable roundedCornersDrawable = (RoundedCornersDrawable) child; applyRoundingParams(roundedCornersDrawable, roundingParams); roundedCornersDrawable.setOverlayColor(roundingParams.getOverlayColor()); } else { // Important: remove the child before wrapping it with a new parent! child = parent.setDrawable(sEmptyDrawable); child = maybeWrapWithRoundedOverlayColor(child, roundingParams); parent.setDrawable(child); } } else if (child instanceof RoundedCornersDrawable) { // Overlay rounding no longer required so remove drawable that was doing the rounding. RoundedCornersDrawable roundedCornersDrawable = (RoundedCornersDrawable) child; // Important: remove the child before wrapping it with a new parent! child = roundedCornersDrawable.setCurrent(sEmptyDrawable); parent.setDrawable(child); // roundedCornersDrawable is removed and will get garbage collected, clear the child callback sEmptyDrawable.setCallback(null); } }
/** * Wraps the given drawable with a new {@link RoundedCornersDrawable}. * * <p>If the provided drawable is null, or if the rounding params do not specify OVERLAY_COLOR * mode, the given drawable is returned without being wrapped. * * @return the wrapping rounded drawable, or the original drawable if the wrapping didn't take * place */ static Drawable maybeWrapWithRoundedOverlayColor( @Nullable Drawable drawable, @Nullable RoundingParams roundingParams) { if (drawable == null || roundingParams == null || roundingParams.getRoundingMethod() != RoundingParams.RoundingMethod.OVERLAY_COLOR) { return drawable; } RoundedCornersDrawable roundedCornersDrawable = new RoundedCornersDrawable(drawable); applyRoundingParams(roundedCornersDrawable, roundingParams); roundedCornersDrawable.setOverlayColor(roundingParams.getOverlayColor()); return roundedCornersDrawable; }