Merge "Call setSize to sync Surface to SurfaceFlinger. DO NOT MERGE" into jb-mr1.1-dev

This commit is contained in:
Sascha Prueter
2012-12-07 12:36:09 -08:00
committed by Android (Google) Code Review
3 changed files with 71 additions and 40 deletions

View File

@ -225,6 +225,9 @@ public class Surface implements Parcelable {
// non compatibility mode. // non compatibility mode.
private Matrix mCompatibleMatrix; private Matrix mCompatibleMatrix;
private int mWidth;
private int mHeight;
private native void nativeCreate(SurfaceSession session, String name, private native void nativeCreate(SurfaceSession session, String name,
int w, int h, int format, int flags) int w, int h, int format, int flags)
throws OutOfResourcesException; throws OutOfResourcesException;
@ -330,6 +333,8 @@ public class Surface implements Parcelable {
checkHeadless(); checkHeadless();
mName = name; mName = name;
mWidth = w;
mHeight = h;
nativeCreate(session, name, w, h, format, flags); nativeCreate(session, name, w, h, format, flags);
mCloseGuard.open("release"); mCloseGuard.open("release");
@ -538,7 +543,7 @@ public class Surface implements Parcelable {
/** @hide */ /** @hide */
public void setPosition(int x, int y) { public void setPosition(int x, int y) {
nativeSetPosition((float)x, (float)y); nativeSetPosition(x, y);
} }
/** @hide */ /** @hide */
@ -548,9 +553,21 @@ public class Surface implements Parcelable {
/** @hide */ /** @hide */
public void setSize(int w, int h) { public void setSize(int w, int h) {
mWidth = w;
mHeight = h;
nativeSetSize(w, h); nativeSetSize(w, h);
} }
/** @hide */
public int getWidth() {
return mWidth;
}
/** @hide */
public int getHeight() {
return mHeight;
}
/** @hide */ /** @hide */
public void hide() { public void hide() {
nativeSetFlags(SURFACE_HIDDEN, SURFACE_HIDDEN); nativeSetFlags(SURFACE_HIDDEN, SURFACE_HIDDEN);

View File

@ -12327,7 +12327,7 @@ public final class ActivityManagerService extends ActivityManagerNative
} }
newConfig.seq = mConfigurationSeq; newConfig.seq = mConfigurationSeq;
mConfiguration = newConfig; mConfiguration = newConfig;
Slog.i(TAG, "Config changed: " + newConfig); Slog.i(TAG, "Config changes=" + Integer.toHexString(changes) + " " + newConfig);
final Configuration configCopy = new Configuration(mConfiguration); final Configuration configCopy = new Configuration(mConfiguration);

View File

@ -5800,6 +5800,8 @@ public class WindowManagerService extends IWindowManager.Stub
// Figure out the part of the screen that is actually the app. // Figure out the part of the screen that is actually the app.
boolean including = false; boolean including = false;
final WindowList windows = displayContent.getWindowList(); final WindowList windows = displayContent.getWindowList();
try {
Surface.openTransaction();
for (int i = windows.size() - 1; i >= 0; i--) { for (int i = windows.size() - 1; i >= 0; i--) {
WindowState ws = windows.get(i); WindowState ws = windows.get(i);
if (!ws.mHasSurface) { if (!ws.mHasSurface) {
@ -5828,8 +5830,17 @@ public class WindowManagerService extends IWindowManager.Stub
// window. // window.
including = !ws.mIsImWindow && !ws.isFullscreen(dw, dh); including = !ws.mIsImWindow && !ws.isFullscreen(dw, dh);
if (maxLayer < ws.mWinAnimator.mSurfaceLayer) { final WindowStateAnimator winAnimator = ws.mWinAnimator;
maxLayer = ws.mWinAnimator.mSurfaceLayer;
// The setSize() method causes all previous Surface transactions to sync to
// the SurfaceFlinger. This will force any outstanding setLayer calls to be
// synced as well for screen capture. Without this we can get black bitmaps.
Surface surface = winAnimator.mSurface;
surface.setSize(surface.getWidth(), surface.getHeight());
if (maxLayer < winAnimator.mSurfaceLayer) {
maxLayer = winAnimator.mSurfaceLayer;
} }
// Don't include wallpaper in bounds calculation // Don't include wallpaper in bounds calculation
@ -5843,7 +5854,10 @@ public class WindowManagerService extends IWindowManager.Stub
frame.union(left, top, right, bottom); frame.union(left, top, right, bottom);
} }
} }
} finally {
Surface.closeTransaction();
Binder.restoreCallingIdentity(ident); Binder.restoreCallingIdentity(ident);
}
// Constrain frame to the screen size. // Constrain frame to the screen size.
frame.intersect(0, 0, dw, dh); frame.intersect(0, 0, dw, dh);