196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy/*
296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * Copyright (C) 2010 The Android Open Source Project
396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy *
496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * you may not use this file except in compliance with the License.
696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * You may obtain a copy of the License at
796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy *
896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy *
1096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * Unless required by applicable law or agreed to in writing, software
1196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
1296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * See the License for the specific language governing permissions and
1496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy * limitations under the License.
1596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy */
1696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
1796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guypackage com.android.test.hwui;
1896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
1996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.app.Activity;
2096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.content.Context;
2196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.graphics.Canvas;
2296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.graphics.Paint;
2396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.graphics.Path;
2496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.os.Bundle;
2596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.util.Log;
2696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport android.view.View;
2796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
2896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport java.util.ArrayList;
2996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guyimport java.util.Random;
3096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
3196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy@SuppressWarnings({"UnusedDeclaration"})
3296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guypublic class PathsCacheActivity extends Activity {
3396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy    private Path mPath;
3496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
3596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy    private final Random mRandom = new Random();
365dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    @SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
3796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy    private final ArrayList<Path> mPathList = new ArrayList<Path>();
3896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
3996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy    @Override
4096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy    protected void onCreate(Bundle savedInstanceState) {
4196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        super.onCreate(savedInstanceState);
4296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
4396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        mPath = makePath();
4496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
4596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        final PathsView view = new PathsView(this);
4696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        setContentView(view);
4796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy    }
4896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
49ca89e2a68703bd428e8b66547d033a6ed35b3595Romain Guy    private static Path makePath() {
5096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        Path path = new Path();
5196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        buildPath(path);
5296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        return path;
5396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy    }
5496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
55ca89e2a68703bd428e8b66547d033a6ed35b3595Romain Guy    private static void buildPath(Path path) {
5696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        path.moveTo(0.0f, 0.0f);
5796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        path.cubicTo(0.0f, 0.0f, 100.0f, 150.0f, 100.0f, 200.0f);
5896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        path.cubicTo(100.0f, 200.0f, 50.0f, 300.0f, -80.0f, 200.0f);
5996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        path.cubicTo(-80.0f, 200.0f, 100.0f, 200.0f, 200.0f, 0.0f);
6096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy    }
6196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
625dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    private static Path makeLargePath() {
635dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        Path path = new Path();
645dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        buildLargePath(path);
655dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        return path;
665dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    }
675dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
685dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    private static void buildLargePath(Path path) {
695dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        path.moveTo(0.0f, 0.0f);
705dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        path.cubicTo(0.0f, 0.0f, 10000.0f, 15000.0f, 10000.0f, 20000.0f);
715dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        path.cubicTo(10000.0f, 20000.0f, 5000.0f, 30000.0f, -8000.0f, 20000.0f);
725dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy        path.cubicTo(-8000.0f, 20000.0f, 10000.0f, 20000.0f, 20000.0f, 0.0f);
735dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy    }
745dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy
7596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy    public class PathsView extends View {
7696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        private final Paint mMediumPaint;
7796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
7896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        public PathsView(Context c) {
7996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            super(c);
8096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
8196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mMediumPaint = new Paint();
8296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mMediumPaint.setAntiAlias(true);
8396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mMediumPaint.setColor(0xe00000ff);
8496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mMediumPaint.setStrokeWidth(10.0f);
8596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mMediumPaint.setStyle(Paint.Style.STROKE);
8696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        }
8796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
8896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        @Override
8996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        protected void onDraw(Canvas canvas) {
9096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            super.onDraw(canvas);
9196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
9296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            canvas.drawARGB(255, 255, 255, 255);
9396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
9496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            canvas.save();
9596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            canvas.translate(550.0f, 60.0f);
9696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            canvas.drawPath(mPath, mMediumPaint);
975d923200846ed59e813373bde789d97d4ccc40b5Romain Guy
985d923200846ed59e813373bde789d97d4ccc40b5Romain Guy            mPath.reset();
995d923200846ed59e813373bde789d97d4ccc40b5Romain Guy            buildPath(mPath);
1005d923200846ed59e813373bde789d97d4ccc40b5Romain Guy
1015d923200846ed59e813373bde789d97d4ccc40b5Romain Guy            canvas.translate(30.0f, 30.0f);
1025d923200846ed59e813373bde789d97d4ccc40b5Romain Guy            canvas.drawPath(mPath, mMediumPaint);
1035d923200846ed59e813373bde789d97d4ccc40b5Romain Guy            canvas.drawPath(mPath, mMediumPaint);
10496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
10596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mPath.reset();
10696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            buildPath(mPath);
10796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
10896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            canvas.translate(30.0f, 30.0f);
10996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            canvas.drawPath(mPath, mMediumPaint);
11096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            canvas.drawPath(mPath, mMediumPaint);
11196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
11296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            canvas.restore();
11396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy
1144bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy            for (int i = 0; i < mRandom.nextInt(20); i++) {
1154bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy                Path path = makePath();
1164bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy                int r = mRandom.nextInt(10);
1174bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy                if (r == 5 || r == 3) {
1184bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy                    mPathList.add(path);
1195dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy                } else if (r == 7) {
1205dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy                    path = makeLargePath();
1215dc7fa709646799a5207a5d217f70aa02bf4a3aaRomain Guy                    mPathList.add(path);
1224bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy                }
1234bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy
1244bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy                canvas.save();
1254bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy                canvas.translate(450.0f + mRandom.nextInt(200), mRandom.nextInt(200));
1264bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy                canvas.drawPath(path, mMediumPaint);
1274bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy                canvas.restore();
1284bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy            }
1294bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy
1304bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy            int r = mRandom.nextInt(100);
1314bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy            if (r == 50) {
1324bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy                mPathList.clear();
1334bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy            }
1344bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy
13596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            invalidate();
13696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy        }
13796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy    }
13896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy}
139