summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorChet Haase <chet@google.com>2012-05-02 11:56:56 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-05-02 11:56:56 -0700
commitfe5984f43a5be9f95d1febb806f3aee8601c7ff4 (patch)
tree807569158eee9a1a7670a3f73a1c186ac80bc330 /tests
parentd07223f8294bbc32c9dbbee295e5c0739ce09550 (diff)
parent810a8676df1d504da17bad80c7bd6638bdd97711 (diff)
downloadframeworks_base-fe5984f43a5be9f95d1febb806f3aee8601c7ff4.zip
frameworks_base-fe5984f43a5be9f95d1febb806f3aee8601c7ff4.tar.gz
frameworks_base-fe5984f43a5be9f95d1febb806f3aee8601c7ff4.tar.bz2
Merge "Corrects invalidation logic for layered views" into jb-dev
Diffstat (limited to 'tests')
-rw-r--r--tests/HwAccelerationTest/AndroidManifest.xml9
-rw-r--r--tests/HwAccelerationTest/res/layout/view_layer_invalidation.xml98
-rw-r--r--tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayerInvalidationActivity.java162
3 files changed, 269 insertions, 0 deletions
diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml
index 3775f9f..786cba3 100644
--- a/tests/HwAccelerationTest/AndroidManifest.xml
+++ b/tests/HwAccelerationTest/AndroidManifest.xml
@@ -675,5 +675,14 @@
</intent-filter>
</activity>
+ <activity
+ android:name="ViewLayerInvalidationActivity"
+ android:label="_ViewLayerInvalidation">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
</application>
</manifest>
diff --git a/tests/HwAccelerationTest/res/layout/view_layer_invalidation.xml b/tests/HwAccelerationTest/res/layout/view_layer_invalidation.xml
new file mode 100644
index 0000000..7df8bb6
--- /dev/null
+++ b/tests/HwAccelerationTest/res/layout/view_layer_invalidation.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 2012, 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.
+*/
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <LinearLayout android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="This is some text"
+ android:id="@+id/nestedStatus"/>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="This is some text"
+ android:id="@+id/invalidateStatus"/>
+ </LinearLayout>
+ <LinearLayout android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:id="@+id/container">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="This is some text"
+ android:id="@+id/textview"/>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="This is some text"
+ android:id="@+id/textviewa"/>
+ <LinearLayout android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/container1">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="This is some text"
+ android:id="@+id/textview1"/>
+ </LinearLayout>
+ <LinearLayout android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/container2">
+ <LinearLayout android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/container2a">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="This is some text"
+ android:id="@+id/textview2"/>
+ </LinearLayout>
+ </LinearLayout>
+ <LinearLayout android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/container3">
+ <LinearLayout android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/container3a">
+ <LinearLayout android:orientation="vertical"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/container3b">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="This is some text"
+ android:id="@+id/textview3"/>
+ </LinearLayout>
+ </LinearLayout>
+ </LinearLayout>
+ </LinearLayout>
+</LinearLayout> \ No newline at end of file
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayerInvalidationActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayerInvalidationActivity.java
new file mode 100644
index 0000000..6d47d6c
--- /dev/null
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ViewLayerInvalidationActivity.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2012 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.hwui;
+
+import android.app.Activity;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+public class ViewLayerInvalidationActivity extends Activity {
+
+ int currentColor = Color.WHITE;
+ boolean nestedLayersOn = false;
+ ArrayList<LinearLayout> linearLayouts = new ArrayList<LinearLayout>();
+ ArrayList<LinearLayout> topLayouts = new ArrayList<LinearLayout>();
+ ArrayList<TextView> textViews = new ArrayList<TextView>();
+ LinearLayout container = null;
+ boolean randomInvalidates = false;
+ TextView nestedStatusTV, invalidateStatusTV;
+ static final String NO_NESTING = "Nested Layer: NO ";
+ static final String NESTING = "Nested Layers: YES ";
+ static final String NO_INVALIDATING = "Random Invalidating: NO ";
+ static final String INVALIDATING = "Random Invalidating: YES ";
+ static final int TEXT_COLOR_INTERVAL = 400;
+ static final int INVALIDATING_INTERVAL = 1000;
+ static final int NESTING_INTERVAL = 2000;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.view_layer_invalidation);
+
+ container = (LinearLayout) findViewById(R.id.container);
+ final LinearLayout container1 = (LinearLayout) findViewById(R.id.container1);
+ final LinearLayout container2 = (LinearLayout) findViewById(R.id.container2);
+ final LinearLayout container3 = (LinearLayout) findViewById(R.id.container3);
+ nestedStatusTV = (TextView) findViewById(R.id.nestedStatus);
+ invalidateStatusTV = (TextView) findViewById(R.id.invalidateStatus);
+ final TextView tva = (TextView) findViewById(R.id.textviewa);
+
+ topLayouts.add(container1);
+ topLayouts.add(container2);
+ topLayouts.add(container3);
+
+ collectLinearLayouts(container);
+ collectTextViews(container);
+
+ nestedStatusTV.setText(NO_NESTING);
+ invalidateStatusTV.setText(NO_INVALIDATING);
+
+ tva.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ container1.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ container2.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ container3.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+
+ container.postDelayed(textColorSetter, TEXT_COLOR_INTERVAL);
+ container.postDelayed(nestedLayerSetter, NESTING_INTERVAL);
+ container.postDelayed(randomInvalidatesSetter, INVALIDATING_INTERVAL);
+ }
+
+ private Runnable textColorSetter = new Runnable() {
+ @Override
+ public void run() {
+ currentColor = (currentColor == Color.WHITE) ? Color.RED : Color.WHITE;
+ for (TextView tv : textViews) {
+ tv.setTextColor(currentColor);
+ }
+ if (randomInvalidates) {
+ randomInvalidator(container);
+ }
+ container.postDelayed(textColorSetter, TEXT_COLOR_INTERVAL);
+ }
+ };
+
+ private Runnable randomInvalidatesSetter = new Runnable() {
+ @Override
+ public void run() {
+ randomInvalidates = !randomInvalidates;
+ invalidateStatusTV.setText(randomInvalidates ? INVALIDATING : NO_INVALIDATING);
+ container.postDelayed(randomInvalidatesSetter, INVALIDATING_INTERVAL);
+ }
+ };
+
+ private Runnable nestedLayerSetter = new Runnable() {
+ @Override
+ public void run() {
+ nestedLayersOn = !nestedLayersOn;
+ nestedStatusTV.setText(nestedLayersOn ? NESTING : NO_NESTING);
+ for (LinearLayout layout : linearLayouts) {
+ layout.setLayerType(nestedLayersOn ?
+ View.LAYER_TYPE_HARDWARE : View.LAYER_TYPE_NONE, null);
+ }
+ if (!nestedLayersOn) {
+ for (LinearLayout layout : topLayouts) {
+ layout.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ }
+ }
+ container.postDelayed(nestedLayerSetter, NESTING_INTERVAL);
+ }
+ };
+
+ /**
+ * Invalidates views based on random chance (50%). This is meant to test
+ * invalidating several items in the hierarchy at the same time, which can cause artifacts
+ * if our invalidation-propagation logic is not sound.
+ */
+ private void randomInvalidator(ViewGroup parent) {
+ for (int i = 0; i < parent.getChildCount(); ++i) {
+ View child = parent.getChildAt(i);
+ if (Math.random() < .5) {
+ child.invalidate();
+ }
+ if (child instanceof ViewGroup) {
+ randomInvalidator((ViewGroup) child);
+ }
+ }
+ }
+
+ private void collectLinearLayouts(View view) {
+ if (!(view instanceof LinearLayout)) {
+ return;
+ }
+ LinearLayout parent = (LinearLayout) view;
+ linearLayouts.add(parent);
+ for (int i = 0; i < parent.getChildCount(); ++i) {
+ collectLinearLayouts(parent.getChildAt(i));
+ }
+ }
+
+ private void collectTextViews(View view) {
+ if (view instanceof TextView) {
+ textViews.add((TextView) view);
+ return;
+ }
+ if (!(view instanceof ViewGroup)) {
+ return;
+ }
+ ViewGroup parent = (ViewGroup) view;
+ for (int i = 0; i < parent.getChildCount(); ++i) {
+ collectTextViews(parent.getChildAt(i));
+ }
+ }
+}