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 491959ef8c171..fd0bb9905ce09 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -185,7 +185,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(); @@ -203,6 +203,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);