Updated DrawableWrapper implementation to support the hidden setXfermode
method to delete the corresponding Xfermode to the wrapped drawable

Added coretest to verify the hidden API properly propagates the Xfermode
to the wrapped drawable

Change-Id: I1f14105b7019b57bfcdd7182bb50ea2465c91ffe
Fixes: 30840201
Test: Ran atest on coretests
diff --git a/core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java b/core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java
new file mode 100644
index 0000000..655efb5
--- /dev/null
+++ b/core/tests/coretests/src/android/graphics/drawable/DrawableWrapperTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.graphics.drawable;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.PorterDuff.Mode;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Xfermode;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class DrawableWrapperTest {
+
+    static class MyWrapper extends DrawableWrapper {
+        MyWrapper(Drawable dr) {
+          super(dr);
+        }
+    }
+
+    /**
+     * Test {@link Drawable#setXfermode(Xfermode)} which is marked
+     * with the hide annotation
+     */
+    @Test
+    public void testSetXfermode() {
+        CacheXfermodeDrawable xferModeDrawable = new CacheXfermodeDrawable();
+        DrawableWrapper wrapper = new MyWrapper(xferModeDrawable);
+        PorterDuffXfermode mode = new PorterDuffXfermode(Mode.MULTIPLY);
+        wrapper.setXfermode(mode);
+        assertSame(xferModeDrawable, wrapper.getDrawable());
+        assertEquals(mode, xferModeDrawable.mXferMode);
+    }
+
+    private static class CacheXfermodeDrawable extends Drawable {
+
+        private Xfermode mXferMode = null;
+
+        @Override
+        public void draw(Canvas canvas) {
+        }
+
+        @Override
+        public void setAlpha(int alpha) {
+        }
+
+        @Override
+        public void setColorFilter(ColorFilter colorFilter) {
+        }
+
+        @Override
+        public int getOpacity() {
+            return 0;
+        }
+
+        @Override
+        public void setXfermode(Xfermode mode) {
+            mXferMode = mode;
+        }
+    }
+}
diff --git a/graphics/java/android/graphics/drawable/DrawableWrapper.java b/graphics/java/android/graphics/drawable/DrawableWrapper.java
index cf821bb..a9e0f9a 100644
--- a/graphics/java/android/graphics/drawable/DrawableWrapper.java
+++ b/graphics/java/android/graphics/drawable/DrawableWrapper.java
@@ -16,11 +16,6 @@
 
 package android.graphics.drawable;
 
-import com.android.internal.R;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.content.pm.ActivityInfo.Config;
@@ -35,10 +30,16 @@
 import android.graphics.PixelFormat;
 import android.graphics.PorterDuff;
 import android.graphics.Rect;
+import android.graphics.Xfermode;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
 import android.view.View;
 
+import com.android.internal.R;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
 import java.io.IOException;
 
 /**
@@ -78,6 +79,16 @@
     }
 
     /**
+     * @hide
+     */
+    @Override
+    public void setXfermode(Xfermode mode) {
+        if (mDrawable != null) {
+            mDrawable.setXfermode(mode);
+        }
+    }
+
+    /**
      * Sets the wrapped drawable.
      *
      * @param dr the wrapped drawable