Merge "Fix issue #2529154 Found SurfaceFlinger timeout in logcat when wake up Camcorder" into froyo
This commit is contained in:
committed by
Android (Google) Code Review
commit
db3ea3d006
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user