Merge "Add a sample showing how to use filtering."
diff --git a/tests/tests/graphics/res/drawable/gradient_drawable_density.xml b/tests/tests/graphics/res/drawable/gradient_drawable_density.xml
new file mode 100644
index 0000000..ad3a3be
--- /dev/null
+++ b/tests/tests/graphics/res/drawable/gradient_drawable_density.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * Copyright (C) 2015 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.
+ -->
+
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="ring"
+ android:innerRadius="10dp"
+ android:thickness="4dp">
+ <gradient
+ android:gradientRadius="10dp" />
+ <corners
+ android:topLeftRadius="8dp"
+ android:topRightRadius="9dp"
+ android:bottomLeftRadius="10dp"
+ android:bottomRightRadius="11dp" />
+ <padding
+ android:left="11dp"
+ android:top="12dp"
+ android:right="13dp"
+ android:bottom="14dp" />
+ <stroke
+ android:color="@android:color/black"
+ android:dashGap="4dp"
+ android:dashWidth="4dp"
+ android:width="2dp" />
+ <size
+ android:width="200dp"
+ android:height="200dp" />
+</shape>
diff --git a/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java b/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
index 1cecd5d..97def25 100644
--- a/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
+++ b/tests/tests/graphics/src/android/graphics/drawable/cts/GradientDrawableTest.java
@@ -16,6 +16,8 @@
package android.graphics.drawable.cts;
+import android.content.res.Resources.Theme;
+import android.content.res.XmlResourceParser;
import android.graphics.cts.R;
import org.xmlpull.v1.XmlPullParser;
@@ -320,4 +322,70 @@
assertEquals(50, d3.getIntrinsicHeight());
assertEquals(40, d3.getIntrinsicWidth());
}
+
+ public void testPreloadDensity() throws XmlPullParserException, IOException {
+ final Resources res = getContext().getResources();
+ final int densityDpi = res.getConfiguration().densityDpi;
+ final Rect tempPadding = new Rect();
+
+ // Capture initial state at default density.
+ final XmlResourceParser parser = DrawableTestUtils.getResourceParser(
+ res, R.drawable.gradient_drawable_density);
+ final GradientDrawable preloadedDrawable = new GradientDrawable();
+ preloadedDrawable.inflate(res, parser, Xml.asAttributeSet(parser));
+ final ConstantState preloadedConstantState = preloadedDrawable.getConstantState();
+ final int origWidth = preloadedDrawable.getIntrinsicWidth();
+ final int origHeight = preloadedDrawable.getIntrinsicHeight();
+ final Rect origPadding = new Rect();
+ preloadedDrawable.getPadding(origPadding);
+
+ // Set density to half of original. Unlike offsets, which are
+ // truncated, dimensions are rounded to the nearest pixel.
+ DrawableTestUtils.setResourcesDensity(res, densityDpi / 2);
+ final GradientDrawable halfDrawable =
+ (GradientDrawable) preloadedConstantState.newDrawable(res);
+ assertEquals(Math.round(origWidth / 2f), halfDrawable.getIntrinsicWidth());
+ assertEquals(Math.round(origHeight / 2f), halfDrawable.getIntrinsicHeight());
+ assertTrue(halfDrawable.getPadding(tempPadding));
+ assertEquals(Math.round(origPadding.left / 2f), tempPadding.left);
+
+ // Set density to double original.
+ DrawableTestUtils.setResourcesDensity(res, densityDpi * 2);
+ final GradientDrawable doubleDrawable =
+ (GradientDrawable) preloadedConstantState.newDrawable(res);
+ assertEquals(origWidth * 2, doubleDrawable.getIntrinsicWidth());
+ assertEquals(origHeight * 2, doubleDrawable.getIntrinsicHeight());
+ assertTrue(doubleDrawable.getPadding(tempPadding));
+ assertEquals(origPadding.left * 2, tempPadding.left);
+
+ // Restore original density.
+ DrawableTestUtils.setResourcesDensity(res, densityDpi);
+ final GradientDrawable origDrawable =
+ (GradientDrawable) preloadedConstantState.newDrawable();
+ assertEquals(origWidth, origDrawable.getIntrinsicWidth());
+ assertEquals(origHeight, origDrawable.getIntrinsicHeight());
+ assertTrue(origDrawable.getPadding(tempPadding));
+ assertEquals(origPadding, tempPadding);
+
+ // Some precision is lost when scaling the half-density
+ // drawable back up to the original density.
+ final Rect sloppyOrigPadding = new Rect();
+ sloppyOrigPadding.left = 2 * Math.round(origPadding.left / 2f);
+ sloppyOrigPadding.top = 2 * Math.round(origPadding.top / 2f);
+ sloppyOrigPadding.right = 2 * Math.round(origPadding.right / 2f);
+ sloppyOrigPadding.bottom = 2 * Math.round(origPadding.bottom / 2f);
+
+ // Ensure theme density is applied correctly.
+ final Theme t = res.newTheme();
+ halfDrawable.applyTheme(t);
+ assertEquals(2 * Math.round(origWidth / 2f), halfDrawable.getIntrinsicWidth());
+ assertEquals(2 * Math.round(origHeight / 2f), halfDrawable.getIntrinsicHeight());
+ assertTrue(halfDrawable.getPadding(tempPadding));
+ assertEquals(sloppyOrigPadding, tempPadding);
+ doubleDrawable.applyTheme(t);
+ assertEquals(origWidth, doubleDrawable.getIntrinsicWidth());
+ assertEquals(origHeight, doubleDrawable.getIntrinsicHeight());
+ assertTrue(doubleDrawable.getPadding(tempPadding));
+ assertEquals(origPadding, tempPadding);
+ }
}