Merge "Fix issue #2529154 Found SurfaceFlinger timeout in logcat when wake up Camcorder" into froyo

This commit is contained in:
Dianne Hackborn
2010-03-31 23:04:22 -07:00
committed by Android (Google) Code Review

View File

@ -105,6 +105,7 @@ public class SurfaceView extends View {
static final int KEEP_SCREEN_ON_MSG = 1; static final int KEEP_SCREEN_ON_MSG = 1;
static final int GET_NEW_SURFACE_MSG = 2; static final int GET_NEW_SURFACE_MSG = 2;
static final int UPDATE_WINDOW_MSG = 3;
int mWindowType = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA; int mWindowType = WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
@ -120,6 +121,9 @@ public class SurfaceView extends View {
case GET_NEW_SURFACE_MSG: { case GET_NEW_SURFACE_MSG: {
handleGetNewSurface(); handleGetNewSurface();
} break; } break;
case UPDATE_WINDOW_MSG: {
updateWindow(false);
} break;
} }
} }
}; };
@ -152,6 +156,9 @@ public class SurfaceView extends View {
int mFormat = -1; int mFormat = -1;
int mType = -1; int mType = -1;
final Rect mSurfaceFrame = new Rect(); final Rect mSurfaceFrame = new Rect();
int mLastSurfaceWidth = -1, mLastSurfaceHeight = -1;
boolean mUpdateWindowNeeded;
boolean mReportDrawNeeded;
private Translator mTranslator; private Translator mTranslator;
public SurfaceView(Context context) { public SurfaceView(Context context) {
@ -369,7 +376,8 @@ public class SurfaceView extends View {
|| mNewSurfaceNeeded; || mNewSurfaceNeeded;
final boolean typeChanged = mType != mRequestedType; final boolean typeChanged = mType != mRequestedType;
if (force || creating || formatChanged || sizeChanged || visibleChanged if (force || creating || formatChanged || sizeChanged || visibleChanged
|| typeChanged || mLeft != mLocation[0] || mTop != mLocation[1]) { || typeChanged || mLeft != mLocation[0] || mTop != mLocation[1]
|| mUpdateWindowNeeded || mReportDrawNeeded) {
if (localLOGV) Log.i(TAG, "Changes: creating=" + creating if (localLOGV) Log.i(TAG, "Changes: creating=" + creating
+ " format=" + formatChanged + " size=" + sizeChanged + " format=" + formatChanged + " size=" + sizeChanged
@ -425,28 +433,47 @@ public class SurfaceView extends View {
mNewSurfaceNeeded = false; mNewSurfaceNeeded = false;
mSurfaceLock.lock(); boolean realSizeChanged;
mDrawingStopped = !visible; boolean reportDrawNeeded;
final int relayoutResult = mSession.relayout(
mWindow, mLayout, mWidth, mHeight,
visible ? VISIBLE : GONE, false, mWinFrame, mContentInsets,
mVisibleInsets, mConfiguration, mSurface);
if (localLOGV) Log.i(TAG, "New surface: " + mSurface
+ ", vis=" + visible + ", frame=" + mWinFrame);
mSurfaceFrame.left = 0; mSurfaceLock.lock();
mSurfaceFrame.top = 0; try {
if (mTranslator == null) { mUpdateWindowNeeded = false;
mSurfaceFrame.right = mWinFrame.width(); reportDrawNeeded = mReportDrawNeeded;
mSurfaceFrame.bottom = mWinFrame.height(); mReportDrawNeeded = false;
} else { mDrawingStopped = !visible;
float appInvertedScale = mTranslator.applicationInvertedScale;
mSurfaceFrame.right = (int) (mWinFrame.width() * appInvertedScale + 0.5f); final int relayoutResult = mSession.relayout(
mSurfaceFrame.bottom = (int) (mWinFrame.height() * appInvertedScale + 0.5f); mWindow, mLayout, mWidth, mHeight,
visible ? VISIBLE : GONE, false, mWinFrame, mContentInsets,
mVisibleInsets, mConfiguration, mSurface);
if ((relayoutResult&WindowManagerImpl.RELAYOUT_FIRST_TIME) != 0) {
mReportDrawNeeded = true;
}
if (localLOGV) Log.i(TAG, "New surface: " + mSurface
+ ", vis=" + visible + ", frame=" + mWinFrame);
mSurfaceFrame.left = 0;
mSurfaceFrame.top = 0;
if (mTranslator == null) {
mSurfaceFrame.right = mWinFrame.width();
mSurfaceFrame.bottom = mWinFrame.height();
} else {
float appInvertedScale = mTranslator.applicationInvertedScale;
mSurfaceFrame.right = (int) (mWinFrame.width() * appInvertedScale + 0.5f);
mSurfaceFrame.bottom = (int) (mWinFrame.height() * appInvertedScale + 0.5f);
}
final int surfaceWidth = mSurfaceFrame.right;
final int surfaceHeight = mSurfaceFrame.bottom;
realSizeChanged = mLastSurfaceWidth != surfaceWidth
|| mLastSurfaceHeight != surfaceHeight;
mLastSurfaceWidth = surfaceWidth;
mLastSurfaceHeight = surfaceHeight;
} finally {
mSurfaceLock.unlock();
} }
mSurfaceLock.unlock();
try { try {
if (visible) { if (visible) {
@ -465,9 +492,9 @@ public class SurfaceView extends View {
} }
} }
if (creating || formatChanged || sizeChanged if (creating || formatChanged || sizeChanged
|| visibleChanged) { || visibleChanged || realSizeChanged) {
for (SurfaceHolder.Callback c : callbacks) { for (SurfaceHolder.Callback c : callbacks) {
c.surfaceChanged(mSurfaceHolder, mFormat, mWidth, mHeight); c.surfaceChanged(mSurfaceHolder, mFormat, myWidth, myHeight);
} }
} }
} else { } else {
@ -475,7 +502,7 @@ public class SurfaceView extends View {
} }
} finally { } finally {
mIsCreating = false; mIsCreating = false;
if (creating || (relayoutResult&WindowManagerImpl.RELAYOUT_FIRST_TIME) != 0) { if (creating || reportDrawNeeded) {
mSession.finishDrawing(mWindow); mSession.finishDrawing(mWindow);
} }
} }
@ -533,17 +560,19 @@ public class SurfaceView extends View {
if (localLOGV) Log.v( if (localLOGV) Log.v(
"SurfaceView", surfaceView + " got resized: w=" + "SurfaceView", surfaceView + " got resized: w=" +
w + " h=" + h + ", cur w=" + mCurWidth + " h=" + mCurHeight); w + " h=" + h + ", cur w=" + mCurWidth + " h=" + mCurHeight);
synchronized (this) { surfaceView.mSurfaceLock.lock();
if (mCurWidth != w || mCurHeight != h) { try {
mCurWidth = w;
mCurHeight = h;
}
if (reportDraw) { if (reportDraw) {
try { surfaceView.mUpdateWindowNeeded = true;
surfaceView.mSession.finishDrawing(surfaceView.mWindow); surfaceView.mReportDrawNeeded = true;
} catch (RemoteException e) { surfaceView.mHandler.sendEmptyMessage(UPDATE_WINDOW_MSG);
} } else if (surfaceView.mWinFrame.width() != w
|| surfaceView.mWinFrame.height() != h) {
surfaceView.mUpdateWindowNeeded = true;
surfaceView.mHandler.sendEmptyMessage(UPDATE_WINDOW_MSG);
} }
} finally {
surfaceView.mSurfaceLock.unlock();
} }
} }
} }