diff options
3 files changed, 54 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 9c631c492f53..68ef815b7d53 100755 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1233,12 +1233,14 @@ final class ActivityStack { mUndrawnActivitiesBelowTopTranslucent.clear(); mHandler.removeMessages(TRANSLUCENT_TIMEOUT_MSG); - if (waitingActivity != null && waitingActivity.app != null && - waitingActivity.app.thread != null) { - try { - waitingActivity.app.thread.scheduleTranslucentConversionComplete( - waitingActivity.appToken, r != null); - } catch (RemoteException e) { + if (waitingActivity != null) { + mWindowManager.setWindowOpaque(waitingActivity.appToken, false); + if (waitingActivity.app != null && waitingActivity.app.thread != null) { + try { + waitingActivity.app.thread.scheduleTranslucentConversionComplete( + waitingActivity.appToken, r != null); + } catch (RemoteException e) { + } } } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 296e50bd133b..ebabcef9a26f 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -4200,10 +4200,25 @@ public class WindowManagerService extends IWindowManager.Stub AppWindowToken atoken = findAppWindowToken(token); if (atoken != null) { atoken.appFullscreen = toOpaque; + // When making translucent, wait until windows below have been drawn. + if (toOpaque) { + // Making opaque so do it now. + setWindowOpaque(token, true); + } requestTraversal(); } } + public void setWindowOpaque(IBinder token, boolean isOpaque) { + AppWindowToken wtoken = findAppWindowToken(token); + if (wtoken != null) { + WindowState win = wtoken.findMainWindow(); + if (win != null) { + win.mWinAnimator.setOpaque(isOpaque); + } + } + } + boolean setTokenVisibilityLocked(AppWindowToken wtoken, WindowManager.LayoutParams lp, boolean visible, int transit, boolean performLayout) { boolean delayed = false; diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index ffb17f1fb374..ef236fb6d545 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -490,6 +490,7 @@ class WindowStateAnimator { private final Rect mWindowCrop = new Rect(); private boolean mShown = false; private int mLayerStack; + private boolean mIsOpaque; private final String mName; public SurfaceTrace(SurfaceSession s, @@ -575,6 +576,16 @@ class WindowStateAnimator { } @Override + public void setOpaque(boolean isOpaque) { + if (isOpaque != mIsOpaque) { + Slog.v(SURFACE_TAG, "setOpaque(" + isOpaque + "): OLD:" + this + + ". Called by " + Debug.getCallers(3)); + mIsOpaque = isOpaque; + } + super.setOpaque(isOpaque); + } + + @Override public void hide() { if (mShown) { Slog.v(SURFACE_TAG, "hide: OLD:" + this + ". Called by " + Debug.getCallers(3)); @@ -620,7 +631,8 @@ class WindowStateAnimator { + mName + " (" + mLayerStack + "): shown=" + mShown + " layer=" + mLayer + " alpha=" + mSurfaceTraceAlpha + " " + mPosition.x + "," + mPosition.y + " " + mSize.x + "x" + mSize.y - + " crop=" + mWindowCrop.toShortString(); + + " crop=" + mWindowCrop.toShortString() + + " opaque=" + mIsOpaque; } } @@ -1337,8 +1349,7 @@ class WindowStateAnimator { Slog.w(TAG, "setTransparentRegionHint: null mSurface after mHasSurface true"); return; } - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, - ">>> OPEN TRANSACTION setTransparentRegion"); + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setTransparentRegion"); SurfaceControl.openTransaction(); try { if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, @@ -1364,8 +1375,7 @@ class WindowStateAnimator { // transformation is being applied by the animation. return; } - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, - ">>> OPEN TRANSACTION setWallpaperOffset"); + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setWallpaperOffset"); SurfaceControl.openTransaction(); try { if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, @@ -1383,6 +1393,22 @@ class WindowStateAnimator { } } + void setOpaque(boolean isOpaque) { + if (mSurfaceControl == null) { + return; + } + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, ">>> OPEN TRANSACTION setOpaque"); + SurfaceControl.openTransaction(); + try { + if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(mWin, "isOpaque=" + isOpaque, + null); + mSurfaceControl.setOpaque(isOpaque); + } finally { + SurfaceControl.closeTransaction(); + if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION setOpaque"); + } + } + // This must be called while inside a transaction. boolean performShowLocked() { if (mWin.isHiddenFromUserLocked()) { |