16be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy/*
26be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy * Copyright (C) 2011 The Android Open Source Project
36be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy *
46be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
56be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy * you may not use this file except in compliance with the License.
66be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy * You may obtain a copy of the License at
76be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy *
86be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
96be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy *
106be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy * Unless required by applicable law or agreed to in writing, software
116be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
126be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy * See the License for the specific language governing permissions and
146be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy * limitations under the License.
156be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy */
166be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
176be3d5561cbeccf0a8257a4acb155657f868e548Romain Guypackage com.android.test.hwui;
186be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
196be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyimport android.app.Activity;
206be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyimport android.graphics.Canvas;
213c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guyimport android.graphics.Paint;
223c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guyimport android.graphics.PorterDuff;
236be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyimport android.graphics.SurfaceTexture;
246be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyimport android.os.Bundle;
256be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyimport android.view.Gravity;
266be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyimport android.view.TextureView;
276be3d5561cbeccf0a8257a4acb155657f868e548Romain Guyimport android.widget.FrameLayout;
286be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
296be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy@SuppressWarnings({"UnusedDeclaration"})
306be3d5561cbeccf0a8257a4acb155657f868e548Romain Guypublic class CanvasTextureViewActivity extends Activity
316be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        implements TextureView.SurfaceTextureListener {
326be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    private TextureView mTextureView;
333c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy    private CanvasTextureViewActivity.RenderingThread mThread;
346be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
356be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    @Override
366be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    protected void onCreate(Bundle savedInstanceState) {
376be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        super.onCreate(savedInstanceState);
386be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
396be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        FrameLayout content = new FrameLayout(this);
406be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
416be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        mTextureView = new TextureView(this);
426be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        mTextureView.setSurfaceTextureListener(this);
433c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy        mTextureView.setOpaque(false);
446be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
456be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        content.addView(mTextureView, new FrameLayout.LayoutParams(500, 500, Gravity.CENTER));
466be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        setContentView(content);
476be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    }
486be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
496be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    @Override
506be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
513c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy        mThread = new RenderingThread(mTextureView);
523c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy        mThread.start();
536be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    }
546be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
556be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    @Override
566be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
576be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        // Ignored
586be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    }
596be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
606be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    @Override
61402f05530352f34d5320c2d23be43c274d97c4e2Grace Kloba    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
623c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy        if (mThread != null) mThread.stopRendering();
63402f05530352f34d5320c2d23be43c274d97c4e2Grace Kloba        return true;
646be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    }
656be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy
666be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    @Override
676be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
686be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy        // Ignored
696be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy    }
703c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy
713c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy    private static class RenderingThread extends Thread {
723c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy        private final TextureView mSurface;
733c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy        private volatile boolean mRunning = true;
743c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy
753c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy        public RenderingThread(TextureView surface) {
763c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy            mSurface = surface;
773c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy        }
783c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy
793c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy        @Override
803c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy        public void run() {
813c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy            float x = 0.0f;
823c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy            float y = 0.0f;
833c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy            float speedX = 5.0f;
843c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy            float speedY = 3.0f;
853c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy
863c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy            Paint paint = new Paint();
873c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy            paint.setColor(0xff00ff00);
883c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy
893c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy            while (mRunning && !Thread.interrupted()) {
903c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                final Canvas canvas = mSurface.lockCanvas(null);
913c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                try {
923c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                    canvas.drawColor(0x00000000, PorterDuff.Mode.CLEAR);
933c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                    canvas.drawRect(x, y, x + 20.0f, y + 20.0f, paint);
943c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                } finally {
953c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                    mSurface.unlockCanvasAndPost(canvas);
963c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                }
973c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy
983c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                if (x + 20.0f + speedX >= mSurface.getWidth() || x + speedX <= 0.0f) {
993c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                    speedX = -speedX;
1003c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                }
1013c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                if (y + 20.0f + speedY >= mSurface.getHeight() || y + speedY <= 0.0f) {
1023c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                    speedY = -speedY;
1033c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                }
1043c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy
1053c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                x += speedX;
1063c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                y += speedY;
1073c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy
1083c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                try {
1093c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                    Thread.sleep(15);
1103c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                } catch (InterruptedException e) {
1113c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                    // Interrupted
1123c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy                }
1133c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy            }
1143c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy        }
1153c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy
1163c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy        void stopRendering() {
1173c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy            interrupt();
1183c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy            mRunning = false;
1193c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy        }
1203c2c9e4e0dde0f3a9c27ccff5313cfbeb4504f8eRomain Guy    }
1216be3d5561cbeccf0a8257a4acb155657f868e548Romain Guy}
122