From 4320d33a065173dff97ddb462c8a6a0a649a41e5 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Fri, 10 Jun 2016 15:13:32 -0700 Subject: [PATCH] Restore setCropInTransaction HiddenForCrop behavior. Prior to c/1106850 setCropInTransaction hid the surface for crop width and height <= 0. That CL allowed setting -1 for crop width and height which SF determines as clearing the crop. Other portions of the code depend on the old behavior though for negative values, so restore the behavior of setCropInTransaction and use a new clearCrop method for the new code. Bug: 29276588 Change-Id: I728666009c362ff635c7ebfb3ef2e83428fb03fe --- .../android/server/wm/WindowStateAnimator.java | 16 +++++++++++----- .../server/wm/WindowSurfaceController.java | 16 +++++++++++++++- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 46b6976664443..36d96979d36ec 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -1289,9 +1289,13 @@ class WindowStateAnimator { void updateSurfaceWindowCrop(Rect clipRect, Rect finalClipRect, boolean recoveringMemory) { if (DEBUG_WINDOW_CROP) Slog.d(TAG, "updateSurfaceWindowCrop: win=" + mWin + " clipRect=" + clipRect + " finalClipRect=" + finalClipRect); - if (!clipRect.equals(mLastClipRect)) { - mLastClipRect.set(clipRect); - mSurfaceController.setCropInTransaction(clipRect, recoveringMemory); + if (clipRect != null) { + if (!clipRect.equals(mLastClipRect)) { + mLastClipRect.set(clipRect); + mSurfaceController.setCropInTransaction(clipRect, recoveringMemory); + } + } else { + mSurfaceController.clearCropInTransaction(recoveringMemory); } if (!finalClipRect.equals(mLastFinalClipRect)) { mLastFinalClipRect.set(finalClipRect); @@ -1480,14 +1484,16 @@ class WindowStateAnimator { mSurfaceController.setPositionAppliesWithResizeInTransaction(true); mSurfaceController.forceScaleableInTransaction(false); } + + Rect clipRect = mTmpClipRect; if (w.inPinnedWorkspace()) { - mTmpClipRect.set(0, 0, -1, -1); + clipRect = null; task.mStack.getDimBounds(mTmpFinalClipRect); mTmpFinalClipRect.inset(-w.mAttrs.surfaceInsets.left, -w.mAttrs.surfaceInsets.top, -w.mAttrs.surfaceInsets.right, -w.mAttrs.surfaceInsets.bottom); } - updateSurfaceWindowCrop(mTmpClipRect, mTmpFinalClipRect, recoveringMemory); + updateSurfaceWindowCrop(clipRect, mTmpFinalClipRect, recoveringMemory); mSurfaceController.setMatrixInTransaction(mDsDx * w.mHScale * mExtraHScale, mDtDx * w.mVScale * mExtraVScale, diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index c30da141d9853..c12b1bf5461b0 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -176,7 +176,7 @@ class WindowSurfaceController { if (SHOW_TRANSACTIONS) logSurface( "CROP " + clipRect.toShortString(), null); try { - if (clipRect.width() != 0 && clipRect.height() != 0) { + if (clipRect.width() > 0 && clipRect.height() > 0) { mSurfaceControl.setWindowCrop(clipRect); mHiddenForCrop = false; updateVisibility(); @@ -194,6 +194,20 @@ class WindowSurfaceController { } } + void clearCropInTransaction(boolean recoveringMemory) { + if (SHOW_TRANSACTIONS) logSurface( + "CLEAR CROP", null); + try { + Rect clipRect = new Rect(0, 0, -1, -1); + mSurfaceControl.setWindowCrop(clipRect); + } catch (RuntimeException e) { + Slog.w(TAG, "Error setting clearing crop of " + this, e); + if (!recoveringMemory) { + mAnimator.reclaimSomeSurfaceMemory("crop", true); + } + } + } + void setFinalCropInTransaction(Rect clipRect) { if (SHOW_TRANSACTIONS) logSurface( "FINAL CROP " + clipRect.toShortString(), null);