Merge "Only use one SurfaceControlWithBackground per AppToken." into nyc-dev
This commit is contained in:
@@ -134,6 +134,9 @@ class AppWindowToken extends WindowToken {
|
|||||||
boolean mAppStopped;
|
boolean mAppStopped;
|
||||||
int mPendingRelaunchCount;
|
int mPendingRelaunchCount;
|
||||||
|
|
||||||
|
private ArrayList<WindowSurfaceController.SurfaceControlWithBackground> mSurfaceViewBackgrounds =
|
||||||
|
new ArrayList<WindowSurfaceController.SurfaceControlWithBackground>();
|
||||||
|
|
||||||
ArrayDeque<Rect> mFrozenBounds = new ArrayDeque<>();
|
ArrayDeque<Rect> mFrozenBounds = new ArrayDeque<>();
|
||||||
ArrayDeque<Configuration> mFrozenMergedConfig = new ArrayDeque<>();
|
ArrayDeque<Configuration> mFrozenMergedConfig = new ArrayDeque<>();
|
||||||
|
|
||||||
@@ -720,6 +723,36 @@ class AppWindowToken extends WindowToken {
|
|||||||
service.mWindowPlacerLocked.performSurfacePlacement();
|
service.mWindowPlacerLocked.performSurfacePlacement();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void addSurfaceViewBackground(WindowSurfaceController.SurfaceControlWithBackground background) {
|
||||||
|
mSurfaceViewBackgrounds.add(background);
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeSurfaceViewBackground(WindowSurfaceController.SurfaceControlWithBackground background) {
|
||||||
|
mSurfaceViewBackgrounds.remove(background);
|
||||||
|
updateSurfaceViewBackgroundVisibilities();
|
||||||
|
}
|
||||||
|
|
||||||
|
// We use DimLayers behind SurfaceViews to prevent holes while resizing and creating.
|
||||||
|
// However, we need to ensure one SurfaceView doesn't cover another when they are both placed
|
||||||
|
// below the main app window (as traditionally a SurfaceView which is never drawn
|
||||||
|
// to is totally translucent). So we look at all our SurfaceView backgrounds and only enable
|
||||||
|
// the background for the SurfaceView with lowest Z order
|
||||||
|
void updateSurfaceViewBackgroundVisibilities() {
|
||||||
|
WindowSurfaceController.SurfaceControlWithBackground bottom = null;
|
||||||
|
int bottomLayer = Integer.MAX_VALUE;
|
||||||
|
for (int i = 0; i < mSurfaceViewBackgrounds.size(); i++) {
|
||||||
|
WindowSurfaceController.SurfaceControlWithBackground sc = mSurfaceViewBackgrounds.get(i);
|
||||||
|
if (sc.mVisible && sc.mLayer < bottomLayer) {
|
||||||
|
bottomLayer = sc.mLayer;
|
||||||
|
bottom = sc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < mSurfaceViewBackgrounds.size(); i++) {
|
||||||
|
WindowSurfaceController.SurfaceControlWithBackground sc = mSurfaceViewBackgrounds.get(i);
|
||||||
|
sc.updateBackgroundVisibility(sc != bottom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void dump(PrintWriter pw, String prefix) {
|
void dump(PrintWriter pw, String prefix) {
|
||||||
super.dump(pw, prefix);
|
super.dump(pw, prefix);
|
||||||
|
|||||||
@@ -84,9 +84,10 @@ class WindowSurfaceController {
|
|||||||
// to a black-out layer placed one Z-layer below the surface.
|
// to a black-out layer placed one Z-layer below the surface.
|
||||||
// This prevents holes to whatever app/wallpaper is underneath.
|
// This prevents holes to whatever app/wallpaper is underneath.
|
||||||
if (animator.mWin.isChildWindow() &&
|
if (animator.mWin.isChildWindow() &&
|
||||||
animator.mWin.mSubLayer < 0) {
|
animator.mWin.mSubLayer < 0 &&
|
||||||
|
animator.mWin.mAppToken != null) {
|
||||||
mSurfaceControl = new SurfaceControlWithBackground(s,
|
mSurfaceControl = new SurfaceControlWithBackground(s,
|
||||||
name, w, h, format, flags);
|
name, w, h, format, flags, animator.mWin.mAppToken);
|
||||||
} else if (DEBUG_SURFACE_TRACE) {
|
} else if (DEBUG_SURFACE_TRACE) {
|
||||||
mSurfaceControl = new SurfaceTrace(
|
mSurfaceControl = new SurfaceTrace(
|
||||||
s, name, w, h, format, flags);
|
s, name, w, h, format, flags);
|
||||||
@@ -754,18 +755,25 @@ class WindowSurfaceController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class SurfaceControlWithBackground extends SurfaceControl {
|
class SurfaceControlWithBackground extends SurfaceControl {
|
||||||
private SurfaceControl mBackgroundControl;
|
private SurfaceControl mBackgroundControl;
|
||||||
private boolean mOpaque = true;
|
private boolean mOpaque = true;
|
||||||
private boolean mVisible = false;
|
private boolean mAppForcedInvisible = false;
|
||||||
|
private AppWindowToken mAppToken;
|
||||||
|
public boolean mVisible = false;
|
||||||
|
public int mLayer = -1;
|
||||||
|
|
||||||
public SurfaceControlWithBackground(SurfaceSession s,
|
public SurfaceControlWithBackground(SurfaceSession s,
|
||||||
String name, int w, int h, int format, int flags)
|
String name, int w, int h, int format, int flags,
|
||||||
|
AppWindowToken token)
|
||||||
throws OutOfResourcesException {
|
throws OutOfResourcesException {
|
||||||
super(s, name, w, h, format, flags);
|
super(s, name, w, h, format, flags);
|
||||||
mBackgroundControl = new SurfaceControl(s, name, w, h,
|
mBackgroundControl = new SurfaceControl(s, name, w, h,
|
||||||
PixelFormat.OPAQUE, flags | SurfaceControl.FX_SURFACE_DIM);
|
PixelFormat.OPAQUE, flags | SurfaceControl.FX_SURFACE_DIM);
|
||||||
mOpaque = (flags & SurfaceControl.OPAQUE) != 0;
|
mOpaque = (flags & SurfaceControl.OPAQUE) != 0;
|
||||||
|
mAppToken = token;
|
||||||
|
|
||||||
|
mAppToken.addSurfaceViewBackground(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -778,6 +786,10 @@ class WindowSurfaceController {
|
|||||||
public void setLayer(int zorder) {
|
public void setLayer(int zorder) {
|
||||||
super.setLayer(zorder);
|
super.setLayer(zorder);
|
||||||
mBackgroundControl.setLayer(zorder - 1);
|
mBackgroundControl.setLayer(zorder - 1);
|
||||||
|
if (mLayer != zorder) {
|
||||||
|
mLayer = zorder;
|
||||||
|
mAppToken.updateSurfaceViewBackgroundVisibilities();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -814,7 +826,7 @@ class WindowSurfaceController {
|
|||||||
public void setOpaque(boolean isOpaque) {
|
public void setOpaque(boolean isOpaque) {
|
||||||
super.setOpaque(isOpaque);
|
super.setOpaque(isOpaque);
|
||||||
mOpaque = isOpaque;
|
mOpaque = isOpaque;
|
||||||
updateBackgroundVisibility();
|
updateBackgroundVisibility(mAppForcedInvisible);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -830,23 +842,28 @@ class WindowSurfaceController {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hide() {
|
public void hide() {
|
||||||
mVisible = false;
|
|
||||||
super.hide();
|
super.hide();
|
||||||
updateBackgroundVisibility();
|
if (mVisible) {
|
||||||
|
mVisible = false;
|
||||||
|
mAppToken.updateSurfaceViewBackgroundVisibilities();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void show() {
|
public void show() {
|
||||||
mVisible = true;
|
|
||||||
super.show();
|
super.show();
|
||||||
updateBackgroundVisibility();
|
if (!mVisible) {
|
||||||
|
mVisible = true;
|
||||||
|
mAppToken.updateSurfaceViewBackgroundVisibilities();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void destroy() {
|
public void destroy() {
|
||||||
super.destroy();
|
super.destroy();
|
||||||
mBackgroundControl.destroy();
|
mBackgroundControl.destroy();
|
||||||
}
|
mAppToken.removeSurfaceViewBackground(this);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void release() {
|
public void release() {
|
||||||
@@ -866,8 +883,9 @@ class WindowSurfaceController {
|
|||||||
mBackgroundControl.deferTransactionUntil(handle, frame);
|
mBackgroundControl.deferTransactionUntil(handle, frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateBackgroundVisibility() {
|
void updateBackgroundVisibility(boolean forcedInvisible) {
|
||||||
if (mOpaque && mVisible) {
|
mAppForcedInvisible = forcedInvisible;
|
||||||
|
if (mOpaque && mVisible && !mAppForcedInvisible) {
|
||||||
mBackgroundControl.show();
|
mBackgroundControl.show();
|
||||||
} else {
|
} else {
|
||||||
mBackgroundControl.hide();
|
mBackgroundControl.hide();
|
||||||
|
|||||||
Reference in New Issue
Block a user