From 16c1bd5db8f4f18e1eee8b19006bba5f06a88123 Mon Sep 17 00:00:00 2001 From: ztenghui Date: Mon, 16 Jun 2014 10:30:58 -0700 Subject: [PATCH] Improve constant state for VectorDrawable Now inflation will not cause duplicated constant states. And update tests. Change-Id: I66861e5451c4c10d18756e8522546ea1cb938a55 --- .../graphics/drawable/VectorDrawable.java | 8 +- tests/VectorDrawableTest/AndroidManifest.xml | 10 +++ .../res/drawable-nodpi/bitmap_drawable01.jpg | Bin 0 -> 3304 bytes .../test/dynamic/BitmapDrawableDupe.java | 78 ++++++++++++++++++ 4 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 tests/VectorDrawableTest/res/drawable-nodpi/bitmap_drawable01.jpg create mode 100644 tests/VectorDrawableTest/src/com/android/test/dynamic/BitmapDrawableDupe.java diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java index c3c1bcabad4e1..a1e1f7612a609 100644 --- a/graphics/java/android/graphics/drawable/VectorDrawable.java +++ b/graphics/java/android/graphics/drawable/VectorDrawable.java @@ -147,10 +147,12 @@ public class VectorDrawable extends Drawable { } private VectorDrawable(VectorDrawableState state, Resources res, Theme theme) { - mVectorState = new VectorDrawableState(state); - - if (theme != null && canApplyTheme()) { + if (theme != null && state.canApplyTheme()) { + // If we need to apply a theme, implicitly mutate. + mVectorState = new VectorDrawableState(state); applyTheme(theme); + } else { + mVectorState = state; } mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode); diff --git a/tests/VectorDrawableTest/AndroidManifest.xml b/tests/VectorDrawableTest/AndroidManifest.xml index db2efc3914633..890214f2dc039 100644 --- a/tests/VectorDrawableTest/AndroidManifest.xml +++ b/tests/VectorDrawableTest/AndroidManifest.xml @@ -32,6 +32,16 @@ + + + + + + + + diff --git a/tests/VectorDrawableTest/res/drawable-nodpi/bitmap_drawable01.jpg b/tests/VectorDrawableTest/res/drawable-nodpi/bitmap_drawable01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dc8c19716be5b0c7d9931f6c973dd9d4f9f3bb75 GIT binary patch literal 3304 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 literal 0 HcmV?d00001 diff --git a/tests/VectorDrawableTest/src/com/android/test/dynamic/BitmapDrawableDupe.java b/tests/VectorDrawableTest/src/com/android/test/dynamic/BitmapDrawableDupe.java new file mode 100644 index 0000000000000..36c8f2b4adf2e --- /dev/null +++ b/tests/VectorDrawableTest/src/com/android/test/dynamic/BitmapDrawableDupe.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2014 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 com.android.test.dynamic; + +import android.app.Activity; +import android.content.res.Resources; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import android.widget.TextView; +import android.widget.Button; +import android.widget.GridLayout; +import android.widget.ScrollView; + +import java.text.DecimalFormat; + +@SuppressWarnings({"UnusedDeclaration"}) +public class BitmapDrawableDupe extends Activity { + private static final String LOGCAT = "VectorDrawable1"; + protected int[] icon = { + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + R.drawable.bitmap_drawable01, + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ScrollView scrollView = new ScrollView(this); + GridLayout container = new GridLayout(this); + scrollView.addView(container); + container.setColumnCount(5); + container.setBackgroundColor(0xFF888888); + + DecimalFormat df = new DecimalFormat("#.##"); + long time = android.os.SystemClock.elapsedRealtimeNanos(); + for (int i = 0; i < icon.length; i++) { + Button button = new Button(this); + button.setWidth(200); + button.setBackgroundResource(icon[i]); + container.addView(button); + } + + setContentView(scrollView); + time = android.os.SystemClock.elapsedRealtimeNanos()-time; + TextView t = new TextView(this); + t.setText("avgS=" + df.format(time / (icon.length * 1000000.)) + " ms"); + container.addView(t); + } +}