1bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck/*
2bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck * Copyright (C) 2014 The Android Open Source Project
3bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck *
4bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck * Licensed under the Apache License, Version 2.0 (the "License");
5bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck * you may not use this file except in compliance with the License.
6bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck * You may obtain a copy of the License at
7bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck *
8bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck *      http://www.apache.org/licenses/LICENSE-2.0
9bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck *
10bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck * Unless required by applicable law or agreed to in writing, software
11bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck * distributed under the License is distributed on an "AS IS" BASIS,
12bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck * See the License for the specific language governing permissions and
14bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck * limitations under the License.
15bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck */
16bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
17bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckpackage com.android.test.hwui;
18bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
19bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckimport android.app.Activity;
20bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckimport android.graphics.Canvas;
21bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckimport android.graphics.Paint;
22bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckimport android.graphics.PorterDuff;
23bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckimport android.graphics.SurfaceTexture;
24bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckimport android.os.Bundle;
25bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckimport android.view.Gravity;
26bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckimport android.view.Surface;
27bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckimport android.view.TextureView;
28bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckimport android.widget.FrameLayout;
29bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
30bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck@SuppressWarnings({"UnusedDeclaration"})
31bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reckpublic class HardwareCanvasTextureViewActivity extends Activity
32bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        implements TextureView.SurfaceTextureListener {
33bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    private TextureView mTextureView;
34bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    private HardwareCanvasTextureViewActivity.RenderingThread mThread;
35bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
36bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    @Override
37bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    protected void onCreate(Bundle savedInstanceState) {
38bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        super.onCreate(savedInstanceState);
39bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
40bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        FrameLayout content = new FrameLayout(this);
41bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
42bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        mTextureView = new TextureView(this);
43bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        mTextureView.setSurfaceTextureListener(this);
44bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        mTextureView.setOpaque(false);
45bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
46bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        content.addView(mTextureView, new FrameLayout.LayoutParams(500, 500, Gravity.CENTER));
47bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        setContentView(content);
48bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    }
49bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
50bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    @Override
51bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
52bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        mThread = new RenderingThread(mTextureView);
53bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        mThread.start();
54bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    }
55bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
56bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    @Override
57bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
58bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        // Ignored
59bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    }
60bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
61bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    @Override
62bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
63bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        if (mThread != null) mThread.stopRendering();
64bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        return true;
65bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    }
66bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
67bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    @Override
68bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
69bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        // Ignored
70bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    }
71bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
72bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    private static class RenderingThread extends Thread {
73bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        private final TextureView mView;
74bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        private final Surface mSurface;
75bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        private volatile boolean mRunning = true;
76bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
77bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        public RenderingThread(TextureView view) {
78bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck            mView = view;
79bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck            mSurface = new Surface(mView.getSurfaceTexture());
80bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        }
81bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
82bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        @Override
83bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        public void run() {
84bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck            float x = 0.0f;
85bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck            float y = 0.0f;
86bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck            float speedX = 5.0f;
87bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck            float speedY = 3.0f;
88bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
89bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck            Paint paint = new Paint();
90bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck            paint.setColor(0xff00ff00);
91bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
92bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck            while (mRunning && !Thread.interrupted()) {
93bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                final Canvas canvas = mSurface.lockHardwareCanvas();
94bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                try {
95bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                    canvas.drawColor(0x00000000, PorterDuff.Mode.CLEAR);
96bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                    canvas.drawRect(x, y, x + 20.0f, y + 20.0f, paint);
97bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                } finally {
98bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                    mSurface.unlockCanvasAndPost(canvas);
99bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                }
100bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
101bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                if (x + 20.0f + speedX >= mView.getWidth() || x + speedX <= 0.0f) {
102bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                    speedX = -speedX;
103bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                }
104bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                if (y + 20.0f + speedY >= mView.getHeight() || y + speedY <= 0.0f) {
105bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                    speedY = -speedY;
106bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                }
107bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
108bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                x += speedX;
109bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                y += speedY;
110bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
111bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                try {
112bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                    Thread.sleep(15);
113bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                } catch (InterruptedException e) {
114bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                    // Interrupted
115bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck                }
116bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck            }
117bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        }
118bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck
119bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        void stopRendering() {
120bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck            interrupt();
121bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck            mRunning = false;
122bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck        }
123bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck    }
124bb2d0cc7e1d487f7021b1f9ec0c6740e41b535f2John Reck}
125