SurfaceView.java revision 64f59342d41849bd365cb43fad7505d5e3daa417
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 209189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshimaimport android.content.res.CompatibilityInfo; 2164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaimport android.content.res.CompatibilityInfo.Translator; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PorterDuff; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Region; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFileDescriptor; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.concurrent.locks.ReentrantLock; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Provides a dedicated drawing surface embedded inside of a view hierarchy. 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can control the format of this surface and, if you like, its size; the 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SurfaceView takes care of placing the surface at the correct location on the 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * screen 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The surface is Z ordered so that it is behind the window holding its 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SurfaceView; the SurfaceView punches a hole in its window to allow its 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * surface to be displayed. The view hierarchy will take care of correctly 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * compositing with the Surface any siblings of the SurfaceView that would 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * normally appear on top of it. This can be used to place overlays such as 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * buttons on top of the Surface, though note however that it can have an 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * impact on performance since a full alpha-blended composite will be performed 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * each time the Surface changes. 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Access to the underlying surface is provided via the SurfaceHolder interface, 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which can be retrieved by calling {@link #getHolder}. 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The Surface will be created for you while the SurfaceView's window is 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * visible; you should implement {@link SurfaceHolder.Callback#surfaceCreated} 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link SurfaceHolder.Callback#surfaceDestroyed} to discover when the 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Surface is created and destroyed as the window is shown and hidden. 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>One of the purposes of this class is to provide a surface in which a 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * secondary thread can render in to the screen. If you are going to use it 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this way, you need to be aware of some threading semantics: 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> All SurfaceView and 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SurfaceHolder.Callback SurfaceHolder.Callback} methods will be called 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the thread running the SurfaceView's window (typically the main thread 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the application). They thus need to correctly synchronize with any 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * state that is also touched by the drawing thread. 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> You must ensure that the drawing thread only touches the underlying 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Surface while it is valid -- between 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SurfaceHolder.Callback#surfaceCreated SurfaceHolder.Callback.surfaceCreated()} 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SurfaceHolder.Callback#surfaceDestroyed SurfaceHolder.Callback.surfaceDestroyed()}. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SurfaceView extends View { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static private final String TAG = "SurfaceView"; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static private final boolean DEBUG = false; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static private final boolean localLOGV = DEBUG ? true : Config.LOGV; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<SurfaceHolder.Callback> mCallbacks 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new ArrayList<SurfaceHolder.Callback>(); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] mLocation = new int[2]; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ReentrantLock mSurfaceLock = new ReentrantLock(); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Surface mSurface = new Surface(); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mDrawingStopped = true; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final WindowManager.LayoutParams mLayout 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new WindowManager.LayoutParams(); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IWindowSession mSession; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MyWindow mWindow; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect mVisibleInsets = new Rect(); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect mWinFrame = new Rect(); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect mContentInsets = new Rect(); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int KEEP_SCREEN_ON_MSG = 1; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int GET_NEW_SURFACE_MSG = 2; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 105c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn int mWindowType = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA; 106c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mIsCreating = false; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Handler mHandler = new Handler() { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (msg.what) { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case KEEP_SCREEN_ON_MSG: { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setKeepScreenOn(msg.arg1 != 0); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GET_NEW_SURFACE_MSG: { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handleGetNewSurface(); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mRequestedVisible = false; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mRequestedWidth = -1; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mRequestedHeight = -1; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mRequestedFormat = PixelFormat.OPAQUE; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mRequestedType = -1; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mHaveFrame = false; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mDestroyReportNeeded = false; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mNewSurfaceNeeded = false; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastLockTime = 0; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mVisible = false; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLeft = -1; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mTop = -1; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mWidth = -1; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mHeight = -1; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mFormat = -1; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mType = -1; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect mSurfaceFrame = new Rect(); 14264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima private Translator mTranslator; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SurfaceView(Context context) { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setWillNotDraw(true); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SurfaceView(Context context, AttributeSet attrs) { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setWillNotDraw(true); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SurfaceView(Context context, AttributeSet attrs, int defStyle) { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setWillNotDraw(true); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the SurfaceHolder providing access and control over this 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * SurfaceView's underlying surface. 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return SurfaceHolder The holder of the surface. 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SurfaceHolder getHolder() { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSurfaceHolder; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onAttachedToWindow() { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onAttachedToWindow(); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParent.requestTransparentRegion(this); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSession = getWindowSession(); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayout.token = getWindowToken(); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayout.setTitle("SurfaceView"); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onWindowVisibilityChanged(int visibility) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onWindowVisibilityChanged(visibility); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRequestedVisible = visibility == VISIBLE; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateWindow(false); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onDetachedFromWindow() { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRequestedVisible = false; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateWindow(false); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveFrame = false; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindow != null) { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSession.remove(mWindow); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindow = null; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSession = null; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayout.token = null; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onDetachedFromWindow(); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int width = getDefaultSize(mRequestedWidth, widthMeasureSpec); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int height = getDefaultSize(mRequestedHeight, heightMeasureSpec); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMeasuredDimension(width, height); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onScrollChanged(int l, int t, int oldl, int oldt) { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onScrollChanged(l, t, oldl, oldt); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateWindow(false); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onSizeChanged(int w, int h, int oldw, int oldh) { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onSizeChanged(w, h, oldw, oldh); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateWindow(false); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean gatherTransparentRegion(Region region) { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean opaque = true; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mPrivateFlags & SKIP_DRAW) == 0) { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this view draws, remove it from the transparent region 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project opaque = super.gatherTransparentRegion(region); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (region != null) { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int w = getWidth(); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int h = getHeight(); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (w>0 && h>0) { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getLocationInWindow(mLocation); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // otherwise, punch a hole in the whole hierarchy 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int l = mLocation[0]; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int t = mLocation[1]; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project region.op(l, t, l+w, t+h, Region.Op.UNION); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (PixelFormat.formatHasAlpha(mRequestedFormat)) { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project opaque = false; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return opaque; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void draw(Canvas canvas) { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // draw() is not called when SKIP_DRAW is set 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mPrivateFlags & SKIP_DRAW) == 0) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // punch a whole in the view-hierarchy below us 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.drawColor(0, PorterDuff.Mode.CLEAR); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.draw(canvas); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 256001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima public boolean dispatchTouchEvent(MotionEvent event) { 257001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima // SurfaceView uses pre-scaled size unless fixed size is requested. This hook 258001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima // scales the event back to the pre-scaled coordinates for such surface. 25964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima if (mRequestedWidth < 0 && mTranslator != null) { 260001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima MotionEvent scaledBack = MotionEvent.obtain(event); 26164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima scaledBack.scale(mTranslator.applicationScale); 262001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima try { 263001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima return super.dispatchTouchEvent(scaledBack); 264001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima } finally { 265001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima scaledBack.recycle(); 266001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima } 267001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima } else { 268001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima return super.dispatchTouchEvent(event); 269001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima } 270001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima } 271001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima 272001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima @Override 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dispatchDraw(Canvas canvas) { 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if SKIP_DRAW is cleared, draw() has already punched a hole 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mPrivateFlags & SKIP_DRAW) == SKIP_DRAW) { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // punch a whole in the view-hierarchy below us 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.drawColor(0, PorterDuff.Mode.CLEAR); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // reposition ourselves where the surface is 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHaveFrame = true; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateWindow(false); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dispatchDraw(canvas); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 285c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn /** 286c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn * Hack to allow special layering of windows. The type is one of the 287c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn * types in WindowManager.LayoutParams. This is a hack so: 288c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn * @hide 289c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn */ 290c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn public void setWindowType(int type) { 291c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn mWindowType = type; 292c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn } 293c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void updateWindow(boolean force) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mHaveFrame) { 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mTranslator = ((ViewRoot)getRootView().getParent()).mTranslator; 29964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 30064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima float appScale = mTranslator == null ? 1.0f : mTranslator.applicationScale; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int myWidth = mRequestedWidth; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (myWidth <= 0) myWidth = getWidth(); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int myHeight = mRequestedHeight; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (myHeight <= 0) myHeight = getHeight(); 306001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima 30764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima // Use original size if the app specified the size of the view, 30864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima // and let the flinger to scale up. 30964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima if (mRequestedWidth <= 0 && mTranslator != null && mTranslator.scalingRequired) { 3109189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima myWidth *= appScale; 3119189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima myHeight *= appScale; 312001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima } 313001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getLocationInWindow(mLocation); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean creating = mWindow == null; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean formatChanged = mFormat != mRequestedFormat; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean sizeChanged = mWidth != myWidth || mHeight != myHeight; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean visibleChanged = mVisible != mRequestedVisible 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || mNewSurfaceNeeded; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean typeChanged = mType != mRequestedType; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (force || creating || formatChanged || sizeChanged || visibleChanged 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || typeChanged || mLeft != mLocation[0] || mTop != mLocation[1]) { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localLOGV) Log.i(TAG, "Changes: creating=" + creating 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " format=" + formatChanged + " size=" + sizeChanged 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " visible=" + visibleChanged 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " left=" + (mLeft != mLocation[0]) 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " top=" + (mTop != mLocation[1])); 32964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean visible = mVisible = mRequestedVisible; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLeft = mLocation[0]; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTop = mLocation[1]; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth = myWidth; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeight = myHeight; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFormat = mRequestedFormat; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = mRequestedType; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima // Scaling/Translate window's layout here because mLayout is not used elsewhere. 34064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 34164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima // Places the window relative 34264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mLayout.x = mLeft; 34364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mLayout.y = mTop; 34464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mLayout.width = getWidth(); 34564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mLayout.height = getHeight(); 34664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima if (mTranslator != null) { 34764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mTranslator.translateLayoutParamsInAppWindowToScreen(mLayout); 34864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima } 34964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayout.format = mRequestedFormat; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayout.flags |=WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | WindowManager.LayoutParams.FLAG_SCALED 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 35564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima | WindowManager.LayoutParams.FLAG_NO_COMPATIBILITY_SCALING 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayout.memoryType = mRequestedType; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindow == null) { 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindow = new MyWindow(this); 362c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn mLayout.type = mWindowType; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayout.gravity = Gravity.LEFT|Gravity.TOP; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSession.add(mWindow, mLayout, 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisible ? VISIBLE : GONE, mContentInsets); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visibleChanged && (!visible || mNewSurfaceNeeded)) { 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reportSurfaceDestroyed(); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNewSurfaceNeeded = false; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceLock.lock(); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDrawingStopped = !visible; 3769189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int relayoutResult = mSession.relayout( 378001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima mWindow, mLayout, mWidth, mHeight, 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project visible ? VISIBLE : GONE, false, mWinFrame, mContentInsets, 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisibleInsets, mSurface); 3818169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localLOGV) Log.i(TAG, "New surface: " + mSurface 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", vis=" + visible + ", frame=" + mWinFrame); 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceFrame.left = 0; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceFrame.top = 0; 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceFrame.right = mWinFrame.width(); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceFrame.bottom = mWinFrame.height(); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceLock.unlock(); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visible) { 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDestroyReportNeeded = true; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceHolder.Callback callbacks[]; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCallbacks) { 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callbacks = new SurfaceHolder.Callback[mCallbacks.size()]; 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallbacks.toArray(callbacks); 3983d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visibleChanged) { 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsCreating = true; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (SurfaceHolder.Callback c : callbacks) { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.surfaceCreated(mSurfaceHolder); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (creating || formatChanged || sizeChanged 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || visibleChanged) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (SurfaceHolder.Callback c : callbacks) { 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.surfaceChanged(mSurfaceHolder, mFormat, mWidth, mHeight); 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsCreating = false; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (creating || (relayoutResult&WindowManagerImpl.RELAYOUT_FIRST_TIME) != 0) { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSession.finishDrawing(mWindow); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localLOGV) Log.v( 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Layout: x=" + mLayout.x + " y=" + mLayout.y + 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " w=" + mLayout.width + " h=" + mLayout.height + 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ", frame=" + mSurfaceFrame); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void reportSurfaceDestroyed() { 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDestroyReportNeeded) { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDestroyReportNeeded = false; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceHolder.Callback callbacks[]; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCallbacks) { 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project callbacks = new SurfaceHolder.Callback[mCallbacks.size()]; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallbacks.toArray(callbacks); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (SurfaceHolder.Callback c : callbacks) { 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.surfaceDestroyed(mSurfaceHolder); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onDetachedFromWindow(); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void handleGetNewSurface() { 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNewSurfaceNeeded = true; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateWindow(false); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static class MyWindow extends IWindow.Stub { 4498169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima private final WeakReference<SurfaceView> mSurfaceView; 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MyWindow(SurfaceView surfaceView) { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceView = new WeakReference<SurfaceView>(surfaceView); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void resized(int w, int h, Rect coveredInsets, 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect visibleInsets, boolean reportDraw) { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceView surfaceView = mSurfaceView.get(); 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (surfaceView != null) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localLOGV) Log.v( 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "SurfaceView", surfaceView + " got resized: w=" + 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project w + " h=" + h + ", cur w=" + mCurWidth + " h=" + mCurHeight); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurWidth != w || mCurHeight != h) { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurWidth = w; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurHeight = h; 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reportDraw) { 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project surfaceView.mSession.finishDrawing(surfaceView.mWindow); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dispatchKey(KeyEvent event) { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceView surfaceView = mSurfaceView.get(); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (surfaceView != null) { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.w("SurfaceView", "Unexpected key event in surface: " + event); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (surfaceView.mSession != null && surfaceView.mSurface != null) { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project surfaceView.mSession.finishKey(surfaceView.mWindow); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dispatchPointer(MotionEvent event, long eventTime) { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("SurfaceView", "Unexpected pointer event in surface: " + event); 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //if (mSession != null && mSurface != null) { 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // try { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // //mSession.finishKey(mWindow); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // } catch (RemoteException ex) { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //} 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dispatchTrackball(MotionEvent event, long eventTime) { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("SurfaceView", "Unexpected trackball event in surface: " + event); 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //if (mSession != null && mSurface != null) { 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // try { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // //mSession.finishKey(mWindow); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // } catch (RemoteException ex) { 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //} 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dispatchAppVisibility(boolean visible) { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The point of SurfaceView is to let the app control the surface. 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dispatchGetNewSurface() { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SurfaceView surfaceView = mSurfaceView.get(); 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (surfaceView != null) { 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = surfaceView.mHandler.obtainMessage(GET_NEW_SURFACE_MSG); 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project surfaceView.mHandler.sendMessage(msg); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void windowFocusChanged(boolean hasFocus, boolean touchEnabled) { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("SurfaceView", "Unexpected focus in surface: focus=" + hasFocus + ", touchEnabled=" + touchEnabled); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void executeCommand(String command, String parameters, ParcelFileDescriptor out) { 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCurWidth = -1; 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCurHeight = -1; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SurfaceHolder mSurfaceHolder = new SurfaceHolder() { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String LOG_TAG = "SurfaceHolder"; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isCreating() { 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIsCreating; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addCallback(Callback callback) { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCallbacks) { 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This is a linear search, but in practice we'll 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // have only a couple callbacks, so it doesn't matter. 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCallbacks.contains(callback) == false) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallbacks.add(callback); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeCallback(Callback callback) { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCallbacks) { 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallbacks.remove(callback); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFixedSize(int width, int height) { 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRequestedWidth != width || mRequestedHeight != height) { 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRequestedWidth = width; 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRequestedHeight = height; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestLayout(); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSizeFromLayout() { 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRequestedWidth != -1 || mRequestedHeight != -1) { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRequestedWidth = mRequestedHeight = -1; 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestLayout(); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFormat(int format) { 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRequestedFormat = format; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindow != null) { 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateWindow(false); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setType(int type) { 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SURFACE_TYPE_NORMAL: 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SURFACE_TYPE_HARDWARE: 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SURFACE_TYPE_GPU: 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SURFACE_TYPE_PUSH_BUFFERS: 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRequestedType = type; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWindow != null) { 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateWindow(false); 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setKeepScreenOn(boolean screenOn) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = mHandler.obtainMessage(KEEP_SCREEN_ON_MSG); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.arg1 = screenOn ? 1 : 0; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.sendMessage(msg); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Canvas lockCanvas() { 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return internalLockCanvas(null); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Canvas lockCanvas(Rect dirty) { 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return internalLockCanvas(dirty); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Canvas internalLockCanvas(Rect dirty) { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mType == SURFACE_TYPE_PUSH_BUFFERS) { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadSurfaceTypeException( 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Surface type is SURFACE_TYPE_PUSH_BUFFERS"); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceLock.lock(); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localLOGV) Log.i(TAG, "Locking canvas... stopped=" 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mDrawingStopped + ", win=" + mWindow); 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Canvas c = null; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mDrawingStopped && mWindow != null) { 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect frame = dirty != null ? dirty : mSurfaceFrame; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = mSurface.lockCanvas(frame); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOG_TAG, "Exception locking surface", e); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localLOGV) Log.i(TAG, "Returned canvas: " + c); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c != null) { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastLockTime = SystemClock.uptimeMillis(); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return c; 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the Surface is not ready to be drawn, then return null, 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // but throttle calls to this function so it isn't called more 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // than every 100ms. 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long now = SystemClock.uptimeMillis(); 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long nextTime = mLastLockTime + 100; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nextTime > now) { 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread.sleep(nextTime-now); 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (InterruptedException e) { 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project now = SystemClock.uptimeMillis(); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastLockTime = now; 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceLock.unlock(); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unlockCanvasAndPost(Canvas canvas) { 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurface.unlockCanvasAndPost(canvas); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurfaceLock.unlock(); 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Surface getSurface() { 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSurface; 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Rect getSurfaceFrame() { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSurfaceFrame; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 665