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