SurfaceView.java revision 61566cc1932468720a831ad5cbc68ee080d613c9
154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/* 254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * you may not use this file except in compliance with the License. 654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * You may obtain a copy of the License at 754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 1054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * See the License for the specific language governing permissions and 1454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * limitations under the License. 1554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 1654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpackage android.view; 1854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1972c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackbornimport com.android.internal.view.BaseIWindow; 2072c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn 2154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.content.Context; 22e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackbornimport android.content.res.Configuration; 2364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshimaimport android.content.res.CompatibilityInfo.Translator; 2454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.graphics.Canvas; 2554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.graphics.PixelFormat; 2654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.graphics.PorterDuff; 2754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.graphics.Rect; 2854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.graphics.Region; 2954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.os.Handler; 3054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.os.Message; 3154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.os.RemoteException; 3254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.os.SystemClock; 3354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.os.ParcelFileDescriptor; 3454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.util.AttributeSet; 3554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport android.util.Log; 3654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 379bdf576615231e4b9693f08bfe3dc886c2edf49eJon Larimerimport java.lang.ref.WeakReference; 389bdf576615231e4b9693f08bfe3dc886c2edf49eJon Larimerimport java.util.ArrayList; 3954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectimport java.util.concurrent.locks.ReentrantLock; 4054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 4154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/** 4254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Provides a dedicated drawing surface embedded inside of a view hierarchy. 4354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * You can control the format of this surface and, if you like, its size; the 4454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * SurfaceView takes care of placing the surface at the correct location on the 4554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * screen 4654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 4754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p>The surface is Z ordered so that it is behind the window holding its 4854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * SurfaceView; the SurfaceView punches a hole in its window to allow its 4954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * surface to be displayed. The view hierarchy will take care of correctly 5054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * compositing with the Surface any siblings of the SurfaceView that would 5154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * normally appear on top of it. This can be used to place overlays such as 5254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * buttons on top of the Surface, though note however that it can have an 5354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * impact on performance since a full alpha-blended composite will be performed 5454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * each time the Surface changes. 5554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 5654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p>Access to the underlying surface is provided via the SurfaceHolder interface, 5754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * which can be retrieved by calling {@link #getHolder}. 5854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 5954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p>The Surface will be created for you while the SurfaceView's window is 6054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * visible; you should implement {@link SurfaceHolder.Callback#surfaceCreated} 6154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * and {@link SurfaceHolder.Callback#surfaceDestroyed} to discover when the 6254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Surface is created and destroyed as the window is shown and hidden. 6354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 6454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <p>One of the purposes of this class is to provide a surface in which a 65334031cd07c3bd09d23fce0ebaf946fc6ecfee26Glenn Kasten * secondary thread can render into the screen. If you are going to use it 6654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * this way, you need to be aware of some threading semantics: 6754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 6854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <ul> 6954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <li> All SurfaceView and 7054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link SurfaceHolder.Callback SurfaceHolder.Callback} methods will be called 7154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * from the thread running the SurfaceView's window (typically the main thread 7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * of the application). They thus need to correctly synchronize with any 7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * state that is also touched by the drawing thread. 7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <li> You must ensure that the drawing thread only touches the underlying 7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Surface while it is valid -- between 7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link SurfaceHolder.Callback#surfaceCreated SurfaceHolder.Callback.surfaceCreated()} 7754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * and 7854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * {@link SurfaceHolder.Callback#surfaceDestroyed SurfaceHolder.Callback.surfaceDestroyed()}. 7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * </ul> 8054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 8154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpublic class SurfaceView extends View { 8254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project static private final String TAG = "SurfaceView"; 8354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project static private final boolean DEBUG = false; 8454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 8554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final ArrayList<SurfaceHolder.Callback> mCallbacks 8654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project = new ArrayList<SurfaceHolder.Callback>(); 8754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 88f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project final int[] mLocation = new int[2]; 89f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project 9054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final ReentrantLock mSurfaceLock = new ReentrantLock(); 9161566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn final Surface mSurface = new Surface(); // Current surface in use 9261566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn final Surface mNewSurface = new Surface(); // New surface we are switching to 9354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project boolean mDrawingStopped = true; 9454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 9554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final WindowManager.LayoutParams mLayout 9654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project = new WindowManager.LayoutParams(); 9754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project IWindowSession mSession; 9854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project MyWindow mWindow; 99f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project final Rect mVisibleInsets = new Rect(); 10054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final Rect mWinFrame = new Rect(); 101f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project final Rect mContentInsets = new Rect(); 102694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn final Configuration mConfiguration = new Configuration(); 103694f79b5d1196640d1beb680b7d1fc68e6e77cbdDianne Hackborn 10454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project static final int KEEP_SCREEN_ON_MSG = 1; 10554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project static final int GET_NEW_SURFACE_MSG = 2; 106726426ee736929e605742bfa52bca4b20095921dDianne Hackborn static final int UPDATE_WINDOW_MSG = 3; 10754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 108c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn int mWindowType = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA; 109c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn 11054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project boolean mIsCreating = false; 11154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 11254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final Handler mHandler = new Handler() { 11354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project @Override 11454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void handleMessage(Message msg) { 11554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project switch (msg.what) { 11654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case KEEP_SCREEN_ON_MSG: { 11754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setKeepScreenOn(msg.arg1 != 0); 11854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } break; 11954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case GET_NEW_SURFACE_MSG: { 12054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project handleGetNewSurface(); 12154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } break; 122726426ee736929e605742bfa52bca4b20095921dDianne Hackborn case UPDATE_WINDOW_MSG: { 123d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn updateWindow(false, false); 124726426ee736929e605742bfa52bca4b20095921dDianne Hackborn } break; 12554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 12654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 12754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project }; 12854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 129e2af5c882b146c3a8c7a37f093d13c8b386e8ebaDianne Hackborn final ViewTreeObserver.OnScrollChangedListener mScrollChangedListener 130e2af5c882b146c3a8c7a37f093d13c8b386e8ebaDianne Hackborn = new ViewTreeObserver.OnScrollChangedListener() { 131e2af5c882b146c3a8c7a37f093d13c8b386e8ebaDianne Hackborn public void onScrollChanged() { 132d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn updateWindow(false, false); 133e2af5c882b146c3a8c7a37f093d13c8b386e8ebaDianne Hackborn } 134e2af5c882b146c3a8c7a37f093d13c8b386e8ebaDianne Hackborn }; 135e2af5c882b146c3a8c7a37f093d13c8b386e8ebaDianne Hackborn 13654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project boolean mRequestedVisible = false; 1376b7f1a62b5094fc72765a2537ee0760572df0950Mathias Agopian boolean mWindowVisibility = false; 1386b7f1a62b5094fc72765a2537ee0760572df0950Mathias Agopian boolean mViewVisibility = false; 13954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int mRequestedWidth = -1; 14054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int mRequestedHeight = -1; 141d6ddcb7f00a7af95b452233d965b922632f78f21Mathias Agopian /* Set SurfaceView's format to 565 by default to maintain backward 142d6ddcb7f00a7af95b452233d965b922632f78f21Mathias Agopian * compatibility with applications assuming this format. 143d6ddcb7f00a7af95b452233d965b922632f78f21Mathias Agopian */ 144d6ddcb7f00a7af95b452233d965b922632f78f21Mathias Agopian int mRequestedFormat = PixelFormat.RGB_565; 14554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 14654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project boolean mHaveFrame = false; 1476d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn boolean mSurfaceCreated = false; 14854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project long mLastLockTime = 0; 14954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 15054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project boolean mVisible = false; 15154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int mLeft = -1; 15254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int mTop = -1; 15354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int mWidth = -1; 15454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int mHeight = -1; 15554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int mFormat = -1; 15654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final Rect mSurfaceFrame = new Rect(); 15730bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown Rect mTmpDirty; 158726426ee736929e605742bfa52bca4b20095921dDianne Hackborn int mLastSurfaceWidth = -1, mLastSurfaceHeight = -1; 159726426ee736929e605742bfa52bca4b20095921dDianne Hackborn boolean mUpdateWindowNeeded; 160726426ee736929e605742bfa52bca4b20095921dDianne Hackborn boolean mReportDrawNeeded; 16164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima private Translator mTranslator; 162f2499fa434521a8948387afe8f0acd4f39620500Romain Guy 163f2499fa434521a8948387afe8f0acd4f39620500Romain Guy private final ViewTreeObserver.OnPreDrawListener mDrawListener = 164f2499fa434521a8948387afe8f0acd4f39620500Romain Guy new ViewTreeObserver.OnPreDrawListener() { 165f2499fa434521a8948387afe8f0acd4f39620500Romain Guy @Override 166f2499fa434521a8948387afe8f0acd4f39620500Romain Guy public boolean onPreDraw() { 167f2499fa434521a8948387afe8f0acd4f39620500Romain Guy // reposition ourselves where the surface is 1680c75622cf80e53c13d079bfe1f3df0b185c4f02dRomain Guy mHaveFrame = getWidth() > 0 && getHeight() > 0; 169f2499fa434521a8948387afe8f0acd4f39620500Romain Guy updateWindow(false, false); 170f2499fa434521a8948387afe8f0acd4f39620500Romain Guy return true; 171f2499fa434521a8948387afe8f0acd4f39620500Romain Guy } 172f2499fa434521a8948387afe8f0acd4f39620500Romain Guy }; 17301d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy private boolean mGlobalListenersAdded; 174f2499fa434521a8948387afe8f0acd4f39620500Romain Guy 17554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public SurfaceView(Context context) { 17654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project super(context); 177d6ddcb7f00a7af95b452233d965b922632f78f21Mathias Agopian init(); 17854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 17954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 18054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public SurfaceView(Context context, AttributeSet attrs) { 18154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project super(context, attrs); 182d6ddcb7f00a7af95b452233d965b922632f78f21Mathias Agopian init(); 18354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 18454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 18554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public SurfaceView(Context context, AttributeSet attrs, int defStyle) { 18654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project super(context, attrs, defStyle); 187d6ddcb7f00a7af95b452233d965b922632f78f21Mathias Agopian init(); 188d6ddcb7f00a7af95b452233d965b922632f78f21Mathias Agopian } 189d6ddcb7f00a7af95b452233d965b922632f78f21Mathias Agopian 190d6ddcb7f00a7af95b452233d965b922632f78f21Mathias Agopian private void init() { 19154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setWillNotDraw(true); 19254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 19354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 19454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 19554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return the SurfaceHolder providing access and control over this 19654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * SurfaceView's underlying surface. 19754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 19854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * @return SurfaceHolder The holder of the surface. 19954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 20054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public SurfaceHolder getHolder() { 20154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mSurfaceHolder; 20254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 20354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 20454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project @Override 20554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project protected void onAttachedToWindow() { 20654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project super.onAttachedToWindow(); 20754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mParent.requestTransparentRegion(this); 20854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mSession = getWindowSession(); 20954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLayout.token = getWindowToken(); 21054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLayout.setTitle("SurfaceView"); 2116b7f1a62b5094fc72765a2537ee0760572df0950Mathias Agopian mViewVisibility = getVisibility() == VISIBLE; 21201d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy 21301d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy if (!mGlobalListenersAdded) { 21401d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy ViewTreeObserver observer = getViewTreeObserver(); 21501d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy observer.addOnScrollChangedListener(mScrollChangedListener); 21601d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy observer.addOnPreDrawListener(mDrawListener); 21701d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy mGlobalListenersAdded = true; 21801d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy } 21954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 22054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 22154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project @Override 22254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project protected void onWindowVisibilityChanged(int visibility) { 22354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project super.onWindowVisibilityChanged(visibility); 2246b7f1a62b5094fc72765a2537ee0760572df0950Mathias Agopian mWindowVisibility = visibility == VISIBLE; 2256b7f1a62b5094fc72765a2537ee0760572df0950Mathias Agopian mRequestedVisible = mWindowVisibility && mViewVisibility; 226d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn updateWindow(false, false); 2276b7f1a62b5094fc72765a2537ee0760572df0950Mathias Agopian } 2286b7f1a62b5094fc72765a2537ee0760572df0950Mathias Agopian 2296b7f1a62b5094fc72765a2537ee0760572df0950Mathias Agopian @Override 2306b7f1a62b5094fc72765a2537ee0760572df0950Mathias Agopian public void setVisibility(int visibility) { 2316b7f1a62b5094fc72765a2537ee0760572df0950Mathias Agopian super.setVisibility(visibility); 2326b7f1a62b5094fc72765a2537ee0760572df0950Mathias Agopian mViewVisibility = visibility == VISIBLE; 2336b7f1a62b5094fc72765a2537ee0760572df0950Mathias Agopian mRequestedVisible = mWindowVisibility && mViewVisibility; 234d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn updateWindow(false, false); 23554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 236afc3e11f10828e113331eb24b65e4f9759f67747Romain Guy 23754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project @Override 23854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project protected void onDetachedFromWindow() { 23901d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy if (mGlobalListenersAdded) { 24001d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy ViewTreeObserver observer = getViewTreeObserver(); 24101d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy observer.removeOnScrollChangedListener(mScrollChangedListener); 24201d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy observer.removeOnPreDrawListener(mDrawListener); 24301d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy mGlobalListenersAdded = false; 24401d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy } 24501d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy 24654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mRequestedVisible = false; 247d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn updateWindow(false, false); 24854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mHaveFrame = false; 24954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mWindow != null) { 25054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project try { 25154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mSession.remove(mWindow); 25254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } catch (RemoteException ex) { 25301d5edc49ae8995aabffe1a30bfd966faaf70bd6Romain Guy // Not much we can do here... 25454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 25554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mWindow = null; 25654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 25754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mSession = null; 25854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLayout.token = null; 25954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 26054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project super.onDetachedFromWindow(); 26154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 26254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 26354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project @Override 26454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 265189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn int width = mRequestedWidth >= 0 266189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn ? resolveSizeAndState(mRequestedWidth, widthMeasureSpec, 0) 267189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn : getDefaultSize(0, widthMeasureSpec); 268189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn int height = mRequestedHeight >= 0 269189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn ? resolveSizeAndState(mRequestedHeight, heightMeasureSpec, 0) 270189ee18d6c6483ad63cc864267328259e2e00b95Dianne Hackborn : getDefaultSize(0, heightMeasureSpec); 27154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setMeasuredDimension(width, height); 27254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 27354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 274ef11530874f86570aa04a10c16a416b274b3fdf5Mathias Agopian /** @hide */ 27554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project @Override 276995bb9d24d3b278939a01e1d05c2b7f337ab0565Mathias Agopian protected boolean setFrame(int left, int top, int right, int bottom) { 277995bb9d24d3b278939a01e1d05c2b7f337ab0565Mathias Agopian boolean result = super.setFrame(left, top, right, bottom); 278d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn updateWindow(false, false); 279995bb9d24d3b278939a01e1d05c2b7f337ab0565Mathias Agopian return result; 28054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 28154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 28254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project @Override 28354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public boolean gatherTransparentRegion(Region region) { 2841cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn if (mWindowType == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) { 2851cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn return super.gatherTransparentRegion(region); 2861cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn } 2871cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn 28854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project boolean opaque = true; 28954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if ((mPrivateFlags & SKIP_DRAW) == 0) { 29054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // this view draws, remove it from the transparent region 29154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project opaque = super.gatherTransparentRegion(region); 29254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else if (region != null) { 29354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int w = getWidth(); 29454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int h = getHeight(); 29554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (w>0 && h>0) { 29654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project getLocationInWindow(mLocation); 29754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // otherwise, punch a hole in the whole hierarchy 29854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int l = mLocation[0]; 29954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int t = mLocation[1]; 30054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project region.op(l, t, l+w, t+h, Region.Op.UNION); 30154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 30254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 30354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (PixelFormat.formatHasAlpha(mRequestedFormat)) { 30454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project opaque = false; 30554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 30654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return opaque; 30754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 30854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 30954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project @Override 31054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void draw(Canvas canvas) { 3111cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn if (mWindowType != WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) { 3121cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn // draw() is not called when SKIP_DRAW is set 3131cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn if ((mPrivateFlags & SKIP_DRAW) == 0) { 3141cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn // punch a whole in the view-hierarchy below us 3151cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn canvas.drawColor(0, PorterDuff.Mode.CLEAR); 3161cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn } 31754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 31854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project super.draw(canvas); 31954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 32054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 32154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project @Override 32254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project protected void dispatchDraw(Canvas canvas) { 3231cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn if (mWindowType != WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) { 3241cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn // if SKIP_DRAW is cleared, draw() has already punched a hole 3251cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn if ((mPrivateFlags & SKIP_DRAW) == SKIP_DRAW) { 3261cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn // punch a whole in the view-hierarchy below us 3271cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn canvas.drawColor(0, PorterDuff.Mode.CLEAR); 3281cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn } 32954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 33054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project super.dispatchDraw(canvas); 33154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 33254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 333c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn /** 33429e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn * Control whether the surface view's surface is placed on top of another 33529e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn * regular surface view in the window (but still behind the window itself). 33629e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn * This is typically used to place overlays on top of an underlying media 33729e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn * surface view. 33829e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn * 33929e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn * <p>Note that this must be set before the surface view's containing 34029e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn * window is attached to the window manager. 34129e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn * 34229e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn * <p>Calling this overrides any previous call to {@link #setZOrderOnTop}. 34329e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn */ 34429e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn public void setZOrderMediaOverlay(boolean isMediaOverlay) { 34529e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn mWindowType = isMediaOverlay 34629e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn ? WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY 34729e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn : WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA; 34829e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn } 34929e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn 35029e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn /** 3511cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn * Control whether the surface view's surface is placed on top of its 3521cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn * window. Normally it is placed behind the window, to allow it to 3531cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn * (for the most part) appear to composite with the views in the 3541cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn * hierarchy. By setting this, you cause it to be placed above the 3551cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn * window. This means that none of the contents of the window this 3561cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn * SurfaceView is in will be visible on top of its surface. 3571cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn * 3581cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn * <p>Note that this must be set before the surface view's containing 3591cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn * window is attached to the window manager. 36029e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn * 36129e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn * <p>Calling this overrides any previous call to {@link #setZOrderMediaOverlay}. 3621cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn */ 36329e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn public void setZOrderOnTop(boolean onTop) { 364ecde72fe411811ca02a2565bf73b86e6e8ddc76bDerek Sollenberger if (onTop) { 365ecde72fe411811ca02a2565bf73b86e6e8ddc76bDerek Sollenberger mWindowType = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL; 366ecde72fe411811ca02a2565bf73b86e6e8ddc76bDerek Sollenberger // ensures the surface is placed below the IME 367ecde72fe411811ca02a2565bf73b86e6e8ddc76bDerek Sollenberger mLayout.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 368ecde72fe411811ca02a2565bf73b86e6e8ddc76bDerek Sollenberger } else { 369ecde72fe411811ca02a2565bf73b86e6e8ddc76bDerek Sollenberger mWindowType = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA; 370ecde72fe411811ca02a2565bf73b86e6e8ddc76bDerek Sollenberger mLayout.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 371ecde72fe411811ca02a2565bf73b86e6e8ddc76bDerek Sollenberger } 3721cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn } 3731cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn 3741cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn /** 375c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn * Hack to allow special layering of windows. The type is one of the 376c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn * types in WindowManager.LayoutParams. This is a hack so: 377c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn * @hide 378c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn */ 379c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn public void setWindowType(int type) { 380c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn mWindowType = type; 381c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn } 38234bf2ee9e695c620e0a4b9a790f1f6ccb8a77234Mitsuru Oshima 383d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn private void updateWindow(boolean force, boolean redrawNeeded) { 38454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!mHaveFrame) { 38554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return; 38654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 3876dd005b48138708762bfade0081d031a2a4a3822Dianne Hackborn ViewRootImpl viewRoot = (ViewRootImpl) getRootView().getParent(); 388168173a698e820ceb1ebf54b4910888891be2056Joe Onorato if (viewRoot != null) { 389168173a698e820ceb1ebf54b4910888891be2056Joe Onorato mTranslator = viewRoot.mTranslator; 390168173a698e820ceb1ebf54b4910888891be2056Joe Onorato } 39164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 3925be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn if (mTranslator != null) { 3935be8de3420ba4c9d816b98e29bdec11715f6b626Dianne Hackborn mSurface.setCompatibilityTranslator(mTranslator); 39438ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima } 39538ed7d7701514ee7127d0430e952930854608c4fMitsuru Oshima 39654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int myWidth = mRequestedWidth; 39754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (myWidth <= 0) myWidth = getWidth(); 39854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int myHeight = mRequestedHeight; 39954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (myHeight <= 0) myHeight = getHeight(); 400001a6e52445b2744b4f2eb00099b98a17f4245c9Mitsuru Oshima 40154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project getLocationInWindow(mLocation); 40254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final boolean creating = mWindow == null; 40354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final boolean formatChanged = mFormat != mRequestedFormat; 40454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final boolean sizeChanged = mWidth != myWidth || mHeight != myHeight; 4056d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn final boolean visibleChanged = mVisible != mRequestedVisible; 406d2112306330ce0c162bee4b864991962ca2b655aMathias Agopian 40754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (force || creating || formatChanged || sizeChanged || visibleChanged 408d2112306330ce0c162bee4b864991962ca2b655aMathias Agopian || mLeft != mLocation[0] || mTop != mLocation[1] 409d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn || mUpdateWindowNeeded || mReportDrawNeeded || redrawNeeded) { 41054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 4116d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (DEBUG) Log.i(TAG, "Changes: creating=" + creating 41254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project + " format=" + formatChanged + " size=" + sizeChanged 41354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project + " visible=" + visibleChanged 41454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project + " left=" + (mLeft != mLocation[0]) 41554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project + " top=" + (mTop != mLocation[1])); 41664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 41754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project try { 41854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final boolean visible = mVisible = mRequestedVisible; 41954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLeft = mLocation[0]; 42054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mTop = mLocation[1]; 42154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mWidth = myWidth; 42254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mHeight = myHeight; 42354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mFormat = mRequestedFormat; 42454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 42564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima // Scaling/Translate window's layout here because mLayout is not used elsewhere. 42664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 42764f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima // Places the window relative 42864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mLayout.x = mLeft; 42964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mLayout.y = mTop; 43064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mLayout.width = getWidth(); 43164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mLayout.height = getHeight(); 43264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima if (mTranslator != null) { 43364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima mTranslator.translateLayoutParamsInAppWindowToScreen(mLayout); 43464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima } 43564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima 43654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLayout.format = mRequestedFormat; 4371cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn mLayout.flags |=WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 4381cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 4391cd403eaac24e0e84619dea07e2d1d60e58e1fd2Dianne Hackborn | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS 44054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project | WindowManager.LayoutParams.FLAG_SCALED 44154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 44254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 44354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ; 444841f13c8e9ff3f7695b6c18a8abcec3c947983ffMitsuru Oshima if (!getContext().getResources().getCompatibilityInfo().supportsScreen()) { 445841f13c8e9ff3f7695b6c18a8abcec3c947983ffMitsuru Oshima mLayout.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW; 446841f13c8e9ff3f7695b6c18a8abcec3c947983ffMitsuru Oshima } 44754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 44854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mWindow == null) { 4499bdf576615231e4b9693f08bfe3dc886c2edf49eJon Larimer mWindow = new MyWindow(this); 450c4d5d02667af6989a3121072871f6a4b1e68b594Dianne Hackborn mLayout.type = mWindowType; 45154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLayout.gravity = Gravity.LEFT|Gravity.TOP; 4529a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn mSession.addWithoutInputChannel(mWindow, mWindow.mSeq, mLayout, 453f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project mVisible ? VISIBLE : GONE, mContentInsets); 45454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 45554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 456726426ee736929e605742bfa52bca4b20095921dDianne Hackborn boolean realSizeChanged; 457726426ee736929e605742bfa52bca4b20095921dDianne Hackborn boolean reportDrawNeeded; 4586d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn 4596d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn int relayoutResult; 4606d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn 461726426ee736929e605742bfa52bca4b20095921dDianne Hackborn mSurfaceLock.lock(); 462726426ee736929e605742bfa52bca4b20095921dDianne Hackborn try { 463726426ee736929e605742bfa52bca4b20095921dDianne Hackborn mUpdateWindowNeeded = false; 464726426ee736929e605742bfa52bca4b20095921dDianne Hackborn reportDrawNeeded = mReportDrawNeeded; 465726426ee736929e605742bfa52bca4b20095921dDianne Hackborn mReportDrawNeeded = false; 466726426ee736929e605742bfa52bca4b20095921dDianne Hackborn mDrawingStopped = !visible; 467726426ee736929e605742bfa52bca4b20095921dDianne Hackborn 4686d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (DEBUG) Log.i(TAG, "Cur surface: " + mSurface); 4696d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn 4706d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn relayoutResult = mSession.relayout( 4719a230e01a1237749a8a19a5de8d46531b0c8ca6aDianne Hackborn mWindow, mWindow.mSeq, mLayout, mWidth, mHeight, 4726d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn visible ? VISIBLE : GONE, 4736d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn WindowManagerImpl.RELAYOUT_DEFER_SURFACE_DESTROY, 4746d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn mWinFrame, mContentInsets, 4756d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn mVisibleInsets, mConfiguration, mNewSurface); 4766d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if ((relayoutResult&WindowManagerImpl.RELAYOUT_RES_FIRST_TIME) != 0) { 477726426ee736929e605742bfa52bca4b20095921dDianne Hackborn mReportDrawNeeded = true; 478726426ee736929e605742bfa52bca4b20095921dDianne Hackborn } 4796d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn 4806d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (DEBUG) Log.i(TAG, "New surface: " + mNewSurface 481726426ee736929e605742bfa52bca4b20095921dDianne Hackborn + ", vis=" + visible + ", frame=" + mWinFrame); 4826d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn 483726426ee736929e605742bfa52bca4b20095921dDianne Hackborn mSurfaceFrame.left = 0; 484726426ee736929e605742bfa52bca4b20095921dDianne Hackborn mSurfaceFrame.top = 0; 485726426ee736929e605742bfa52bca4b20095921dDianne Hackborn if (mTranslator == null) { 486726426ee736929e605742bfa52bca4b20095921dDianne Hackborn mSurfaceFrame.right = mWinFrame.width(); 487726426ee736929e605742bfa52bca4b20095921dDianne Hackborn mSurfaceFrame.bottom = mWinFrame.height(); 488726426ee736929e605742bfa52bca4b20095921dDianne Hackborn } else { 489726426ee736929e605742bfa52bca4b20095921dDianne Hackborn float appInvertedScale = mTranslator.applicationInvertedScale; 490726426ee736929e605742bfa52bca4b20095921dDianne Hackborn mSurfaceFrame.right = (int) (mWinFrame.width() * appInvertedScale + 0.5f); 491726426ee736929e605742bfa52bca4b20095921dDianne Hackborn mSurfaceFrame.bottom = (int) (mWinFrame.height() * appInvertedScale + 0.5f); 492726426ee736929e605742bfa52bca4b20095921dDianne Hackborn } 493726426ee736929e605742bfa52bca4b20095921dDianne Hackborn 494726426ee736929e605742bfa52bca4b20095921dDianne Hackborn final int surfaceWidth = mSurfaceFrame.right; 495726426ee736929e605742bfa52bca4b20095921dDianne Hackborn final int surfaceHeight = mSurfaceFrame.bottom; 496726426ee736929e605742bfa52bca4b20095921dDianne Hackborn realSizeChanged = mLastSurfaceWidth != surfaceWidth 497726426ee736929e605742bfa52bca4b20095921dDianne Hackborn || mLastSurfaceHeight != surfaceHeight; 498726426ee736929e605742bfa52bca4b20095921dDianne Hackborn mLastSurfaceWidth = surfaceWidth; 499726426ee736929e605742bfa52bca4b20095921dDianne Hackborn mLastSurfaceHeight = surfaceHeight; 500726426ee736929e605742bfa52bca4b20095921dDianne Hackborn } finally { 501726426ee736929e605742bfa52bca4b20095921dDianne Hackborn mSurfaceLock.unlock(); 502589cebe2d58591403de4a77077941c0454bc91bcMitsuru Oshima } 50354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 50454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project try { 505d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn redrawNeeded |= creating | reportDrawNeeded; 506d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn 5076d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn SurfaceHolder.Callback callbacks[] = null; 50854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 5096d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn final boolean surfaceChanged = 5106d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn (relayoutResult&WindowManagerImpl.RELAYOUT_RES_SURFACE_CHANGED) != 0; 5116d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (mSurfaceCreated && (surfaceChanged || (!visible && visibleChanged))) { 5126d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn mSurfaceCreated = false; 5136d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (mSurface.isValid()) { 5146d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (DEBUG) Log.i(TAG, "visibleChanged -- surfaceDestroyed"); 5156d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn callbacks = getSurfaceCallbacks(); 5166d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn for (SurfaceHolder.Callback c : callbacks) { 5176d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn c.surfaceDestroyed(mSurfaceHolder); 5186d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 5193d91492d694cf00474fec792134e496be6ee0313Mitsuru Oshima } 5206d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 5216d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn 52261566cc1932468720a831ad5cbc68ee080d613c9Dianne Hackborn mSurface.transferFrom(mNewSurface); 52354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 5246d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (visible) { 5256d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (!mSurfaceCreated && (surfaceChanged || visibleChanged)) { 5266d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn mSurfaceCreated = true; 52754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mIsCreating = true; 5286d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (DEBUG) Log.i(TAG, "visibleChanged -- surfaceCreated"); 5296d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (callbacks == null) { 5306d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn callbacks = getSurfaceCallbacks(); 5316d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 53254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (SurfaceHolder.Callback c : callbacks) { 53354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project c.surfaceCreated(mSurfaceHolder); 53454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 53554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 53654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (creating || formatChanged || sizeChanged 537726426ee736929e605742bfa52bca4b20095921dDianne Hackborn || visibleChanged || realSizeChanged) { 5386d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (DEBUG) Log.i(TAG, "surfaceChanged -- format=" + mFormat 5396d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn + " w=" + myWidth + " h=" + myHeight); 5406d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (callbacks == null) { 5416d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn callbacks = getSurfaceCallbacks(); 5426d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 543251fd430c7e355ad440202c83b0c6d91f5bf93e5Dianne Hackborn for (SurfaceHolder.Callback c : callbacks) { 544251fd430c7e355ad440202c83b0c6d91f5bf93e5Dianne Hackborn c.surfaceChanged(mSurfaceHolder, mFormat, myWidth, myHeight); 545251fd430c7e355ad440202c83b0c6d91f5bf93e5Dianne Hackborn } 546d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 547d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (redrawNeeded) { 5486d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (DEBUG) Log.i(TAG, "surfaceRedrawNeeded"); 5496d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (callbacks == null) { 5506d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn callbacks = getSurfaceCallbacks(); 5516d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn } 55254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (SurfaceHolder.Callback c : callbacks) { 553d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (c instanceof SurfaceHolder.Callback2) { 554d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn ((SurfaceHolder.Callback2)c).surfaceRedrawNeeded( 555d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn mSurfaceHolder); 556d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn } 55754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 55854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 55954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 56054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } finally { 56154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mIsCreating = false; 562d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn if (redrawNeeded) { 5636d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (DEBUG) Log.i(TAG, "finishedDrawing"); 56454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mSession.finishDrawing(mWindow); 56554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 5666d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn mSession.performDeferredDestroy(mWindow); 56754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 56854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } catch (RemoteException ex) { 56954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 5706d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (DEBUG) Log.v( 57154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project TAG, "Layout: x=" + mLayout.x + " y=" + mLayout.y + 57254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " w=" + mLayout.width + " h=" + mLayout.height + 57354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ", frame=" + mSurfaceFrame); 57454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 57554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 57654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 5776d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn private SurfaceHolder.Callback[] getSurfaceCallbacks() { 5786d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn SurfaceHolder.Callback callbacks[]; 5796d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn synchronized (mCallbacks) { 5806d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn callbacks = new SurfaceHolder.Callback[mCallbacks.size()]; 5816d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn mCallbacks.toArray(callbacks); 58254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 5836d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn return callbacks; 58454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 58554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 58654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project void handleGetNewSurface() { 587d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn updateWindow(false, false); 58854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 589b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Project 5907179b8133d4a1d8e5f26cbe3da6aa978094e75c9Derek Sollenberger /** 5917179b8133d4a1d8e5f26cbe3da6aa978094e75c9Derek Sollenberger * Check to see if the surface has fixed size dimensions or if the surface's 5927179b8133d4a1d8e5f26cbe3da6aa978094e75c9Derek Sollenberger * dimensions are dimensions are dependent on its current layout. 5937179b8133d4a1d8e5f26cbe3da6aa978094e75c9Derek Sollenberger * 5947179b8133d4a1d8e5f26cbe3da6aa978094e75c9Derek Sollenberger * @return true if the surface has dimensions that are fixed in size 5957179b8133d4a1d8e5f26cbe3da6aa978094e75c9Derek Sollenberger * @hide 5967179b8133d4a1d8e5f26cbe3da6aa978094e75c9Derek Sollenberger */ 5977179b8133d4a1d8e5f26cbe3da6aa978094e75c9Derek Sollenberger public boolean isFixedSize() { 5987179b8133d4a1d8e5f26cbe3da6aa978094e75c9Derek Sollenberger return (mRequestedWidth != -1 || mRequestedHeight != -1); 5997179b8133d4a1d8e5f26cbe3da6aa978094e75c9Derek Sollenberger } 6007179b8133d4a1d8e5f26cbe3da6aa978094e75c9Derek Sollenberger 60172c82ab9923025a91bbabb32e56bfea27bfd083bDianne Hackborn private static class MyWindow extends BaseIWindow { 6028169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima private final WeakReference<SurfaceView> mSurfaceView; 6039bdf576615231e4b9693f08bfe3dc886c2edf49eJon Larimer 6049bdf576615231e4b9693f08bfe3dc886c2edf49eJon Larimer public MyWindow(SurfaceView surfaceView) { 6059bdf576615231e4b9693f08bfe3dc886c2edf49eJon Larimer mSurfaceView = new WeakReference<SurfaceView>(surfaceView); 6069bdf576615231e4b9693f08bfe3dc886c2edf49eJon Larimer } 6079bdf576615231e4b9693f08bfe3dc886c2edf49eJon Larimer 608f013e1afd1e68af5e3b868c26a653bbfb39538f8The Android Open Source Project public void resized(int w, int h, Rect coveredInsets, 609e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn Rect visibleInsets, boolean reportDraw, Configuration newConfig) { 6109bdf576615231e4b9693f08bfe3dc886c2edf49eJon Larimer SurfaceView surfaceView = mSurfaceView.get(); 6119bdf576615231e4b9693f08bfe3dc886c2edf49eJon Larimer if (surfaceView != null) { 6126d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (DEBUG) Log.v( 6139bdf576615231e4b9693f08bfe3dc886c2edf49eJon Larimer "SurfaceView", surfaceView + " got resized: w=" + 614b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Project w + " h=" + h + ", cur w=" + mCurWidth + " h=" + mCurHeight); 615726426ee736929e605742bfa52bca4b20095921dDianne Hackborn surfaceView.mSurfaceLock.lock(); 616726426ee736929e605742bfa52bca4b20095921dDianne Hackborn try { 6179bdf576615231e4b9693f08bfe3dc886c2edf49eJon Larimer if (reportDraw) { 618726426ee736929e605742bfa52bca4b20095921dDianne Hackborn surfaceView.mUpdateWindowNeeded = true; 619726426ee736929e605742bfa52bca4b20095921dDianne Hackborn surfaceView.mReportDrawNeeded = true; 620726426ee736929e605742bfa52bca4b20095921dDianne Hackborn surfaceView.mHandler.sendEmptyMessage(UPDATE_WINDOW_MSG); 621726426ee736929e605742bfa52bca4b20095921dDianne Hackborn } else if (surfaceView.mWinFrame.width() != w 622726426ee736929e605742bfa52bca4b20095921dDianne Hackborn || surfaceView.mWinFrame.height() != h) { 623726426ee736929e605742bfa52bca4b20095921dDianne Hackborn surfaceView.mUpdateWindowNeeded = true; 624726426ee736929e605742bfa52bca4b20095921dDianne Hackborn surfaceView.mHandler.sendEmptyMessage(UPDATE_WINDOW_MSG); 62554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 626726426ee736929e605742bfa52bca4b20095921dDianne Hackborn } finally { 627726426ee736929e605742bfa52bca4b20095921dDianne Hackborn surfaceView.mSurfaceLock.unlock(); 62854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 62954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 63054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 63154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 63254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void dispatchAppVisibility(boolean visible) { 63354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // The point of SurfaceView is to let the app control the surface. 63454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 635b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Project 63654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void dispatchGetNewSurface() { 6379bdf576615231e4b9693f08bfe3dc886c2edf49eJon Larimer SurfaceView surfaceView = mSurfaceView.get(); 6389bdf576615231e4b9693f08bfe3dc886c2edf49eJon Larimer if (surfaceView != null) { 639b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Project Message msg = surfaceView.mHandler.obtainMessage(GET_NEW_SURFACE_MSG); 640b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Project surfaceView.mHandler.sendMessage(msg); 6419bdf576615231e4b9693f08bfe3dc886c2edf49eJon Larimer } 64254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 64354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 64454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void windowFocusChanged(boolean hasFocus, boolean touchEnabled) { 64554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Log.w("SurfaceView", "Unexpected focus in surface: focus=" + hasFocus + ", touchEnabled=" + touchEnabled); 64654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 64754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 64854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void executeCommand(String command, String parameters, ParcelFileDescriptor out) { 64954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 65054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 65154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int mCurWidth = -1; 65254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int mCurHeight = -1; 65354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 65454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 65554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private SurfaceHolder mSurfaceHolder = new SurfaceHolder() { 65654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 65754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private static final String LOG_TAG = "SurfaceHolder"; 65854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 65954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public boolean isCreating() { 66054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mIsCreating; 66154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 66254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 66354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void addCallback(Callback callback) { 66454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project synchronized (mCallbacks) { 66554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // This is a linear search, but in practice we'll 66654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // have only a couple callbacks, so it doesn't matter. 66754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mCallbacks.contains(callback) == false) { 66854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCallbacks.add(callback); 66954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 67054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 67154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 67254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 67354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void removeCallback(Callback callback) { 67454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project synchronized (mCallbacks) { 67554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mCallbacks.remove(callback); 67654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 67754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 67854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 67954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setFixedSize(int width, int height) { 68054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mRequestedWidth != width || mRequestedHeight != height) { 68154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mRequestedWidth = width; 68254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mRequestedHeight = height; 68354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project requestLayout(); 68454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 68554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 68654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 68754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setSizeFromLayout() { 68854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mRequestedWidth != -1 || mRequestedHeight != -1) { 68954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mRequestedWidth = mRequestedHeight = -1; 69054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project requestLayout(); 69154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 69254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 69354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 69454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setFormat(int format) { 6952d468c5d73cc1cefbcfa8d98e30622c54756918cMathias Agopian 6962d468c5d73cc1cefbcfa8d98e30622c54756918cMathias Agopian // for backward compatibility reason, OPAQUE always 6972d468c5d73cc1cefbcfa8d98e30622c54756918cMathias Agopian // means 565 for SurfaceView 6982d468c5d73cc1cefbcfa8d98e30622c54756918cMathias Agopian if (format == PixelFormat.OPAQUE) 6992d468c5d73cc1cefbcfa8d98e30622c54756918cMathias Agopian format = PixelFormat.RGB_565; 7002d468c5d73cc1cefbcfa8d98e30622c54756918cMathias Agopian 70154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mRequestedFormat = format; 70254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (mWindow != null) { 703d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn updateWindow(false, false); 70454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 70554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 70654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 707d2112306330ce0c162bee4b864991962ca2b655aMathias Agopian /** 708d2112306330ce0c162bee4b864991962ca2b655aMathias Agopian * @deprecated setType is now ignored. 709d2112306330ce0c162bee4b864991962ca2b655aMathias Agopian */ 710d2112306330ce0c162bee4b864991962ca2b655aMathias Agopian @Deprecated 711d2112306330ce0c162bee4b864991962ca2b655aMathias Agopian public void setType(int type) { } 71254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 71354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setKeepScreenOn(boolean screenOn) { 71454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Message msg = mHandler.obtainMessage(KEEP_SCREEN_ON_MSG); 71554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project msg.arg1 = screenOn ? 1 : 0; 71654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mHandler.sendMessage(msg); 71754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 71854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 71954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public Canvas lockCanvas() { 72054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return internalLockCanvas(null); 72154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 72254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 72354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public Canvas lockCanvas(Rect dirty) { 72454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return internalLockCanvas(dirty); 72554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 72654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 72754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private final Canvas internalLockCanvas(Rect dirty) { 72854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mSurfaceLock.lock(); 72954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 7306d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (DEBUG) Log.i(TAG, "Locking canvas... stopped=" 73154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project + mDrawingStopped + ", win=" + mWindow); 73254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 73354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Canvas c = null; 73454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!mDrawingStopped && mWindow != null) { 73530bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown if (dirty == null) { 73630bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown if (mTmpDirty == null) { 73730bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown mTmpDirty = new Rect(); 73830bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown } 73930bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown mTmpDirty.set(mSurfaceFrame); 74030bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown dirty = mTmpDirty; 74130bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown } 74230bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown 74354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project try { 74430bc34f191ca8a009af313fc751e5b4bff6e39a1Jeff Brown c = mSurface.lockCanvas(dirty); 74554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } catch (Exception e) { 74654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Log.e(LOG_TAG, "Exception locking surface", e); 74754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 74854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 74954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 7506d05fd3c795088ac60f86382df5a66d631e8a0cbDianne Hackborn if (DEBUG) Log.i(TAG, "Returned canvas: " + c); 75154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (c != null) { 75254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLastLockTime = SystemClock.uptimeMillis(); 75354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return c; 75454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 75554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 75654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // If the Surface is not ready to be drawn, then return null, 75754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // but throttle calls to this function so it isn't called more 75854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // than every 100ms. 75954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project long now = SystemClock.uptimeMillis(); 76054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project long nextTime = mLastLockTime + 100; 76154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (nextTime > now) { 76254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project try { 76354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Thread.sleep(nextTime-now); 76454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } catch (InterruptedException e) { 76554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 76654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project now = SystemClock.uptimeMillis(); 76754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 76854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mLastLockTime = now; 76954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mSurfaceLock.unlock(); 77054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 77154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return null; 77254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 77354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 77454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void unlockCanvasAndPost(Canvas canvas) { 77554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mSurface.unlockCanvasAndPost(canvas); 77654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mSurfaceLock.unlock(); 77754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 77854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 77954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public Surface getSurface() { 78054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mSurface; 78154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 78254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 78354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public Rect getSurfaceFrame() { 78454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return mSurfaceFrame; 78554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 78654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project }; 78754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 788