1d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase/* 2d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * Copyright (C) 2012 The Android Open Source Project 3d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * 4d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * Licensed under the Apache License, Version 2.0 (the "License"); 5d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * you may not use this file except in compliance with the License. 6d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * You may obtain a copy of the License at 7d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * 8d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * http://www.apache.org/licenses/LICENSE-2.0 9d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * 10d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * Unless required by applicable law or agreed to in writing, software 11d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * distributed under the License is distributed on an "AS IS" BASIS, 12d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * See the License for the specific language governing permissions and 14d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * limitations under the License. 15d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase */ 16d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 17d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haasepackage com.android.test.hwui; 18d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 19d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haaseimport android.app.Activity; 20d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haaseimport android.content.Context; 21d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haaseimport android.graphics.Canvas; 22d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haaseimport android.graphics.Paint; 23d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haaseimport android.graphics.Path; 24d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haaseimport android.os.Bundle; 25d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haaseimport android.util.MathUtils; 26d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haaseimport android.view.View; 27d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 28d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase/** 29d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * The point of this test is to ensure that we can cause many paths to be created, drawn, 30d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * and destroyed without causing hangs or crashes. This tests the native reference counting 31d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * scheme in particular, because we should be able to have the Java-level path finalized 32d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * without destroying the underlying native path object until we are done referencing it 33d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase * in pending DisplayLists. 34d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase */ 35d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haasepublic class PathDestructionActivity extends Activity { 36d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 37d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase private static final int MIN_SIZE = 20; 38d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase @Override 39d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase protected void onCreate(Bundle savedInstanceState) { 40d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase super.onCreate(savedInstanceState); 41d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 42d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase MyView view = new MyView(this); 43d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase setContentView(view); 44d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 45d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 46d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase private static class MyView extends View { 47d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase Paint strokePaint = new Paint(Paint.ANTI_ALIAS_FLAG); 48d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase Paint fillPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 49d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase Paint fillAndStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG); 50d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 51d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase private MyView(Context context) { 52d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase super(context); 53d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase strokePaint.setStyle(Paint.Style.STROKE); 54d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase fillPaint.setStyle(Paint.Style.FILL); 55d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase fillAndStrokePaint.setStyle(Paint.Style.FILL_AND_STROKE); 56d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 57d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 58d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase private Path getRandomPath() { 59d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase float left, top, right, bottom; 60d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase left = MathUtils.random(getWidth() - MIN_SIZE); 61d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase top = MathUtils.random(getHeight() - MIN_SIZE); 62d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase right = left + MathUtils.random(getWidth() - left); 63d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase bottom = top + MathUtils.random(getHeight() - top); 64d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase Path path = new Path(); 65d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase path.moveTo(left, top); 66d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase path.lineTo(right, top); 67d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase path.lineTo(right, bottom); 68d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase path.lineTo(left, bottom); 69d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase path.close(); 70d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase return path; 71d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 72d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 73d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase private int getRandomColor() { 74d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase int red = MathUtils.random(255); 75d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase int green = MathUtils.random(255); 76d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase int blue = MathUtils.random(255); 77d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase return 0xff000000 | red << 16 | green << 8 | blue; 78d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 79d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 80d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase @Override 81d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase protected void onDraw(Canvas canvas) { 82d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase Path path; 83d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase for (int i = 0; i < 15; ++i) { 84d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase path = getRandomPath(); 85d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase strokePaint.setColor(getRandomColor()); 86d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase canvas.drawPath(path, strokePaint); 87d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase path = null; 88d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase path = getRandomPath(); 89d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase fillPaint.setColor(getRandomColor()); 90d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase canvas.drawPath(path, fillPaint); 91d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase path = null; 92d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase path = getRandomPath(); 93d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase fillAndStrokePaint.setColor(getRandomColor()); 94d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase canvas.drawPath(path, fillAndStrokePaint); 95d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase path = null; 96d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 97d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 98d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase invalidate(); 99d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 100d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 101d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase} 102