diff options
author | Chet Haase <chet@google.com> | 2012-05-02 11:56:56 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-05-02 11:56:56 -0700 |
commit | fe5984f43a5be9f95d1febb806f3aee8601c7ff4 (patch) | |
tree | 807569158eee9a1a7670a3f73a1c186ac80bc330 /tests | |
parent | d07223f8294bbc32c9dbbee295e5c0739ce09550 (diff) | |
parent | 810a8676df1d504da17bad80c7bd6638bdd97711 (diff) | |
download | frameworks_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')
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)); + } + } +} |