From 19723a4a2bca0660f7ee7c29926af285d94ab5a2 Mon Sep 17 00:00:00 2001 From: Filip Gruszczynski Date: Wed, 25 Nov 2015 15:01:48 -0800 Subject: [PATCH] Revert "Destroy docked divider surface when it's hidden." This reverts commit cb5f57bc580d7f73b93c8f504daa4dcd74cdce72. Change-Id: I1f77e1ccd5382ed57b8e4165afd79db5223f51c1 --- .../android/server/wm/WindowManagerService.java | 54 +++++++++------------- .../java/com/android/server/wm/WindowState.java | 24 +++------- .../com/android/server/wm/WindowStateAnimator.java | 21 ++++----- .../android/server/wm/WindowSurfaceController.java | 6 ++- .../com/android/server/wm/WindowSurfacePlacer.java | 20 +++++++- 5 files changed, 62 insertions(+), 63 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 21d3bbaea730..ac90daf97b90 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -110,7 +110,6 @@ import android.util.Log; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; -import android.util.SparseBooleanArray; import android.util.SparseIntArray; import android.util.TimeUtils; import android.util.TypedValue; @@ -406,7 +405,7 @@ public class WindowManagerService extends IWindowManager.Stub /** * Windows whose surface should be destroyed. */ - private final ArrayList mDestroySurface = new ArrayList<>(); + final ArrayList mDestroySurface = new ArrayList<>(); /** * Windows with a preserved surface waiting to be destroyed. These windows @@ -443,11 +442,11 @@ public class WindowManagerService extends IWindowManager.Stub WindowState[] mRebuildTmp = new WindowState[20]; /** - * Stores for each user whether screencapture is disabled for all their windows. + * Stores for each user whether screencapture is disabled * This array is essentially a cache for all userId for * {@link android.app.admin.DevicePolicyManager#getScreenCaptureDisabled} */ - private SparseBooleanArray mScreenCaptureDisabled = new SparseBooleanArray(); + SparseArray mScreenCaptureDisabled = new SparseArray<>(); IInputMethodManager mInputMethodManager; @@ -2109,11 +2108,25 @@ public class WindowManagerService extends IWindowManager.Stub executeAppTransition(); } + /** + * Returns whether screen capture is disabled for all windows of a specific user. + */ + boolean isScreenCaptureDisabledLocked(int userId) { + Boolean disabled = mScreenCaptureDisabled.get(userId); + if (disabled == null) { + return false; + } + return disabled; + } + boolean isSecureLocked(WindowState w) { - if ((w.mAttrs.flags & FLAG_SECURE) != 0) { + if ((w.mAttrs.flags&WindowManager.LayoutParams.FLAG_SECURE) != 0) { + return true; + } + if (isScreenCaptureDisabledLocked(UserHandle.getUserId(w.mOwnerUid))) { return true; } - return mScreenCaptureDisabled.get(UserHandle.getUserId(w.mOwnerUid)); + return false; } /** @@ -2637,10 +2650,8 @@ public class WindowManagerService extends IWindowManager.Stub Slog.i(TAG, "Relayout " + win + ": oldVis=" + oldVisibility + " newVis=" + viewVisibility, stack); } - final AppWindowToken appToken = win.mAppToken; - final boolean visible = viewVisibility == View.VISIBLE - && (appToken == null ? win.mPolicyVisibility : !appToken.clientHidden); - if (visible) { + if (viewVisibility == View.VISIBLE && + (win.mAppToken == null || !win.mAppToken.clientHidden)) { result = relayoutVisibleWindow(outConfig, result, win, winAnimator, attrChanges, oldVisibility); try { @@ -2726,8 +2737,8 @@ public class WindowManagerService extends IWindowManager.Stub mWallpaperControllerLocked.updateWallpaperOffset( win, displayInfo.logicalWidth, displayInfo.logicalHeight, false); } - if (appToken != null) { - appToken.updateReportedVisibilityLocked(); + if (win.mAppToken != null) { + win.mAppToken.updateReportedVisibilityLocked(); } if (winAnimator.mReportSurfaceResized) { winAnimator.mReportSurfaceResized = false; @@ -10200,25 +10211,6 @@ public class WindowManagerService extends IWindowManager.Stub mDestroySurface.add(win); } - boolean destroySurfacesLocked() { - boolean wallpaperDestroyed = false; - for (int i = mDestroySurface.size() - 1; i >= 0; i--) { - WindowState win = mDestroySurface.get(i); - win.mDestroying = false; - if (mInputMethodWindow == win) { - mInputMethodWindow = null; - } - if (mWallpaperControllerLocked.isWallpaperTarget(win)) { - wallpaperDestroyed = true; - } - if (!win.shouldSaveSurface()) { - win.mWinAnimator.destroySurfaceLocked(); - } - } - mDestroySurface.clear(); - return wallpaperDestroyed; - } - private final class LocalService extends WindowManagerInternal { @Override public void requestTraversalFromDisplayManager() { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index a0a2162b0f90..064b4128a2ce 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -411,10 +411,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { final private Rect mTmpRect = new Rect(); - // This window often remains added but hidden, so we want to destroy its surface when it's not - // visible. - private final boolean mDestroySurfaceWhenHidden; - WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token, WindowState attachedWindow, int appOp, int seq, WindowManager.LayoutParams a, int viewVisibility, final DisplayContent displayContent) { @@ -462,7 +458,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { mSubLayer = 0; mInputWindowHandle = null; mWinAnimator = null; - mDestroySurfaceWhenHidden = false; return; } mDeathRecipient = deathRecipient; @@ -561,7 +556,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { mInputWindowHandle = new InputWindowHandle( mAppToken != null ? mAppToken.mInputApplicationHandle : null, this, displayContent.getDisplayId()); - mDestroySurfaceWhenHidden = mAttrs.type == TYPE_DOCK_DIVIDER; } void attach() { @@ -1319,10 +1313,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { mHasSurface = hasSurface; } - boolean shouldDestroySurfaceWhenAnimationFinishes() { - return mExiting || (mDestroySurfaceWhenHidden && !mPolicyVisibilityAfterAnim); - } - private final class DeadWindowEventReceiver extends InputEventReceiver { DeadWindowEventReceiver(InputChannel inputChannel) { super(inputChannel, mService.mH.getLooper()); @@ -1605,11 +1595,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { // Already showing. return false; } - if (!mHasSurface && mDestroySurfaceWhenHidden) { - // This is a window that doesn't retain the surface when it's hidden, so immediately - // when we want to show it again, we need to create the surface for it. - mWinAnimator.createSurfaceLocked(); - } if (DEBUG_VISIBILITY) Slog.v(TAG, "Policy visibility true: " + this); if (doAnimation) { if (DEBUG_VISIBILITY) Slog.v(TAG, "doAnimation: mPolicyVisibility=" @@ -1645,7 +1630,8 @@ final class WindowState implements WindowManagerPolicy.WindowState { doAnimation = false; } } - final boolean current = doAnimation ? mPolicyVisibilityAfterAnim : mPolicyVisibility; + boolean current = doAnimation ? mPolicyVisibilityAfterAnim + : mPolicyVisibility; if (!current) { // Already hiding. return false; @@ -1656,9 +1642,11 @@ final class WindowState implements WindowManagerPolicy.WindowState { doAnimation = false; } } - mPolicyVisibilityAfterAnim = false; - if (!doAnimation) { + if (doAnimation) { + mPolicyVisibilityAfterAnim = false; + } else { if (DEBUG_VISIBILITY) Slog.v(TAG, "Policy visibility false: " + this); + mPolicyVisibilityAfterAnim = false; mPolicyVisibility = false; // Window is no longer visible -- make sure if we were waiting // for it to be displayed before enabling the display, that diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 9726034d0c0f..93c2ff608442 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -446,7 +446,7 @@ class WindowStateAnimator { } } - if (!mWin.shouldDestroySurfaceWhenAnimationFinishes()) { + if (!mWin.mExiting) { return; } @@ -454,13 +454,12 @@ class WindowStateAnimator { return; } - if (localLOGV) Slog.v(TAG, "Exit animation finished in " + this + ": remove=" - + mWin.mRemoveOnExit); + if (WindowManagerService.localLOGV) Slog.v( + TAG, "Exit animation finished in " + this + + ": remove=" + mWin.mRemoveOnExit); if (mSurfaceController != null && mSurfaceController.hasSurface()) { - mService.scheduleSurfaceDestroy(mWin); - if (mWin.mExiting) { - mWin.mDestroying = true; - } + mService.mDestroySurface.add(mWin); + mWin.mDestroying = true; hide("finishExit"); } mWin.mExiting = false; @@ -646,7 +645,7 @@ class WindowStateAnimator { return null; } - if (localLOGV) { + if (WindowManagerService.localLOGV) { Slog.v(TAG, "Got surface: " + mSurfaceController + ", set left=" + w.mFrame.left + " top=" + w.mFrame.top + ", animLayer=" + mAnimLayer); @@ -667,7 +666,7 @@ class WindowStateAnimator { mAnimLayer); mLastHidden = true; - if (localLOGV) Slog.v( + if (WindowManagerService.localLOGV) Slog.v( TAG, "Created surface " + this); } return mSurfaceController; @@ -974,7 +973,7 @@ class WindowStateAnimator { //Slog.i(TAG, "Not applying alpha transform"); } - if ((DEBUG_SURFACE_TRACE || localLOGV) + if ((DEBUG_SURFACE_TRACE || WindowManagerService.localLOGV) && (mShownAlpha == 1.0 || mShownAlpha == 0.0)) Slog.v( TAG, "computeShownFrameLocked: Animating " + this + " mAlpha=" + mAlpha + " self=" + (selfTransformation ? mTransformation.getAlpha() : "null") @@ -995,7 +994,7 @@ class WindowStateAnimator { return; } - if (localLOGV) Slog.v( + if (WindowManagerService.localLOGV) Slog.v( TAG, "computeShownFrameLocked: " + this + " not attached, mAlpha=" + mAlpha); diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index b3c23d1a8ab0..f8b8d6ced8d8 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -296,8 +296,10 @@ class WindowSurfaceController { } boolean showRobustlyInTransaction() { - if (SHOW_TRANSACTIONS) logSurface("SHOW (performLayout)", null); - if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + this + " during relayout"); + if (SHOW_TRANSACTIONS) logSurface( + "SHOW (performLayout)", null); + if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + this + + " during relayout"); if (mHiddenForCrop) { return false; diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index 54d18e9cf363..214901991fac 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -381,7 +381,25 @@ class WindowSurfacePlacer { } // Destroy the surface of any windows that are no longer visible. - final boolean wallpaperDestroyed = mService.destroySurfacesLocked(); + boolean wallpaperDestroyed = false; + i = mService.mDestroySurface.size(); + if (i > 0) { + do { + i--; + WindowState win = mService.mDestroySurface.get(i); + win.mDestroying = false; + if (mService.mInputMethodWindow == win) { + mService.mInputMethodWindow = null; + } + if (mWallpaperControllerLocked.isWallpaperTarget(win)) { + wallpaperDestroyed = true; + } + if (!win.shouldSaveSurface()) { + win.mWinAnimator.destroySurfaceLocked(); + } + } while (i > 0); + mService.mDestroySurface.clear(); + } // Time to remove any exiting tokens? for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { -- 2.11.0