From 99ca2a8470a48906aaba2d76c856037933496352 Mon Sep 17 00:00:00 2001
From: Alan Viverette <alanv@google.com>
Date: Mon, 8 Jun 2015 16:10:27 -0700
Subject: Account for hotspot bounds in RippleDrawable projection check

Bug: 21502154
Change-Id: Iedf4bd07f10ec13070a68870304ab651c1f15c68
---
 .../android/graphics/drawable/RippleDrawable.java  | 26 ++++++++++++++++------
 1 file changed, 19 insertions(+), 7 deletions(-)

(limited to 'graphics/java')

diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java
index 1af48ca..134451b 100644
--- a/graphics/java/android/graphics/drawable/RippleDrawable.java
+++ b/graphics/java/android/graphics/drawable/RippleDrawable.java
@@ -333,17 +333,29 @@ public class RippleDrawable extends LayerDrawable {
      */
     @Override
     public boolean isProjected() {
-        // If the maximum radius is contained entirely within the bounds, we
-        // don't need to project this ripple.
+        // If the layer is bounded, then we don't need to project.
+        if (isBounded()) {
+            return false;
+        }
+
+        // Otherwise, if the maximum radius is contained entirely within the
+        // bounds then we don't need to project. This is sort of a hack to
+        // prevent check box ripples from being projected across the edges of
+        // scroll views. It does not impact rendering performance, and it can
+        // be removed once we have better handling of projection in scrollable
+        // views.
         final int radius = mState.mMaxRadius;
-        final Rect bounds = getBounds();
-        if (radius != RADIUS_AUTO && radius <= bounds.width() / 2
-                && radius <= bounds.height() / 2) {
+        final Rect drawableBounds = getBounds();
+        final Rect hotspotBounds = mHotspotBounds;
+        if (radius != RADIUS_AUTO
+                && radius <= hotspotBounds.width() / 2
+                && radius <= hotspotBounds.height() / 2
+                && (drawableBounds.equals(hotspotBounds)
+                        || drawableBounds.contains(hotspotBounds))) {
             return false;
         }
 
-        // Otherwise, if the layer is bounded then we don't need to project.
-        return !isBounded();
+        return true;
     }
 
     private boolean isBounded() {
-- 
cgit v1.1