Loading services/core/java/com/android/server/wm/AppWindowToken.java +33 −0 Original line number Original line Diff line number Diff line Loading @@ -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<>(); Loading Loading @@ -734,6 +737,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); Loading services/core/java/com/android/server/wm/WindowSurfaceController.java +31 −13 Original line number Original line Diff line number Diff line Loading @@ -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); Loading Loading @@ -758,18 +759,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 Loading @@ -782,6 +790,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 Loading Loading @@ -818,7 +830,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 Loading @@ -834,22 +846,27 @@ 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 Loading @@ -870,8 +887,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(); Loading Loading
services/core/java/com/android/server/wm/AppWindowToken.java +33 −0 Original line number Original line Diff line number Diff line Loading @@ -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<>(); Loading Loading @@ -734,6 +737,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); Loading
services/core/java/com/android/server/wm/WindowSurfaceController.java +31 −13 Original line number Original line Diff line number Diff line Loading @@ -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); Loading Loading @@ -758,18 +759,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 Loading @@ -782,6 +790,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 Loading Loading @@ -818,7 +830,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 Loading @@ -834,22 +846,27 @@ 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 Loading @@ -870,8 +887,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(); Loading