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