diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 2fff53791f528..814f15eb2a48c 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1042,6 +1042,11 @@ package android.graphics.drawable { method public android.graphics.Xfermode getXfermode(); } + public class RippleDrawable extends android.graphics.drawable.LayerDrawable { + method public float getTargetBackgroundOpacity(); + method public void setBackgroundActive(boolean, boolean, boolean, boolean); + } + public class ShapeDrawable extends android.graphics.drawable.Drawable { method public void setXfermode(@Nullable android.graphics.Xfermode); } diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index 74cad1aaa057d..54c9f6222f7e2 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -16,6 +16,8 @@ package android.graphics.drawable; +import android.annotation.TestApi; + import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.LOCAL_VARIABLE; import static java.lang.annotation.ElementType.METHOD; @@ -321,6 +323,7 @@ public class RippleDrawable extends LayerDrawable { boolean pressed = false; boolean focused = false; boolean hovered = false; + boolean windowFocused = false; for (int state : stateSet) { if (state == R.attr.state_enabled) { @@ -331,10 +334,12 @@ public class RippleDrawable extends LayerDrawable { pressed = true; } else if (state == R.attr.state_hovered) { hovered = true; + } else if (state == R.attr.state_window_focused) { + windowFocused = true; } } setRippleActive(enabled && pressed); - setBackgroundActive(hovered, focused, pressed); + setBackgroundActive(hovered, focused, pressed, windowFocused); return changed; } @@ -358,7 +363,10 @@ public class RippleDrawable extends LayerDrawable { } } - private void setBackgroundActive(boolean hovered, boolean focused, boolean pressed) { + /** @hide */ + @TestApi + public void setBackgroundActive(boolean hovered, boolean focused, boolean pressed, + boolean windowFocused) { if (mState.mRippleStyle == STYLE_SOLID) { if (mBackground == null && (hovered || focused)) { mBackground = new RippleBackground(this, mHotspotBounds, isBounded()); @@ -370,7 +378,7 @@ public class RippleDrawable extends LayerDrawable { } else { if (focused || hovered) { if (!pressed) { - enterPatternedBackgroundAnimation(focused, hovered); + enterPatternedBackgroundAnimation(focused, hovered, windowFocused); } } else { exitPatternedBackgroundAnimation(); @@ -840,9 +848,20 @@ public class RippleDrawable extends LayerDrawable { invalidateSelf(false); } - private void enterPatternedBackgroundAnimation(boolean focused, boolean hovered) { + /** @hide */ + @TestApi + public float getTargetBackgroundOpacity() { + return mTargetBackgroundOpacity; + } + + private void enterPatternedBackgroundAnimation(boolean focused, boolean hovered, + boolean windowFocused) { mBackgroundOpacity = 0; - mTargetBackgroundOpacity = focused ? .6f : hovered ? .2f : 0f; + if (focused) { + mTargetBackgroundOpacity = windowFocused ? .6f : .2f; + } else { + mTargetBackgroundOpacity = hovered ? .2f : 0f; + } if (mBackgroundAnimation != null) mBackgroundAnimation.cancel(); // after cancel mRunBackgroundAnimation = true;