diff options
| author | 2018-01-29 15:03:23 -0800 | |
|---|---|---|
| committer | 2018-01-31 12:39:46 -0800 | |
| commit | 32bcb10e336741c8e43a35ee1048c7ce36257e39 (patch) | |
| tree | 5eeae7a6fdb42d892e73b77a71f9ec8db5357bec | |
| parent | f0586626e5955b183c11f46a9d04886f4b300209 (diff) | |
Restore pinned stack shadows.
We use the approach of outsetting the stack bounds and then
insetting windows which don't have surfaceInsets by said outsets.
Test: Manual. go/wm-smoke
Bug: 72657549
Change-Id: I9ac7e13ec696f88f02794175d0d44ac870f91d33
4 files changed, 46 insertions, 3 deletions
diff --git a/core/java/android/app/WindowConfiguration.java b/core/java/android/app/WindowConfiguration.java index 085fc79f58e4..46566e79d99c 100644 --- a/core/java/android/app/WindowConfiguration.java +++ b/core/java/android/app/WindowConfiguration.java @@ -146,6 +146,9 @@ public class WindowConfiguration implements Parcelable, Comparable<WindowConfigu }) public @interface WindowConfig {} + /** @hide */ + public static final int PINNED_WINDOWING_MODE_ELEVATION_IN_DIP = 5; + public WindowConfiguration() { unset(); } diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 95bc352747d2..eadefc919934 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -86,6 +86,7 @@ import android.view.animation.Interpolator; import android.widget.FrameLayout; import android.widget.PopupWindow; +import static android.app.WindowConfiguration.PINNED_WINDOWING_MODE_ELEVATION_IN_DIP; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; @@ -2216,7 +2217,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind elevation = dipToPx(elevation); mElevationAdjustedForStack = true; } else if (windowingMode == WINDOWING_MODE_PINNED) { - elevation = dipToPx(DECOR_SHADOW_UNFOCUSED_HEIGHT_IN_DIP); + elevation = dipToPx(PINNED_WINDOWING_MODE_ELEVATION_IN_DIP); mElevationAdjustedForStack = true; } else { mElevationAdjustedForStack = false; diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index ae5341bd8e45..a0d1480711a7 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -21,6 +21,7 @@ import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; +import static android.app.WindowConfiguration.PINNED_WINDOWING_MODE_ELEVATION_IN_DIP; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; import static android.content.res.Configuration.DENSITY_DPI_UNDEFINED; @@ -53,6 +54,7 @@ import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; import android.os.RemoteException; +import android.util.DisplayMetrics; import android.util.EventLog; import android.util.Slog; import android.util.SparseArray; @@ -741,14 +743,32 @@ public class TaskStack extends WindowContainer<Task> implements scheduleAnimation(); } + /** + * Calculate an amount by which to expand the stack bounds in each direction. + * Used to make room for shadows in the pinned windowing mode. + */ + int getStackOutset() { + if (inPinnedWindowingMode()) { + final DisplayMetrics displayMetrics = getDisplayContent().getDisplayMetrics(); + return mService.dipToPixel(PINNED_WINDOWING_MODE_ELEVATION_IN_DIP, + displayMetrics); + } + return 0; + } + private void updateSurfaceSize(SurfaceControl.Transaction transaction) { if (mSurfaceControl == null) { return; } final Rect stackBounds = getBounds(); - final int width = stackBounds.width(); - final int height = stackBounds.height(); + int width = stackBounds.width(); + int height = stackBounds.height(); + + final int outset = getStackOutset(); + width += 2*outset; + height += 2*outset; + if (width == mLastSurfaceSize.x && height == mLastSurfaceSize.y) { return; } @@ -1749,4 +1769,12 @@ public class TaskStack extends WindowContainer<Task> implements mDimmer.stopDim(getPendingTransaction()); scheduleAnimation(); } + + @Override + void getRelativePosition(Point outPos) { + super.getRelativePosition(outPos); + final int outset = getStackOutset(); + outPos.x -= outset; + outPos.y -= outset; + } } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 53a8d82f551e..36e3612bf10a 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -4576,6 +4576,17 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP outPoint.offset(-parentBounds.left, -parentBounds.top); } + TaskStack stack = getStack(); + + // If we have stack outsets, that means the top-left + // will be outset, and we need to inset ourselves + // to account for it. If we actually have shadows we will + // then un-inset ourselves by the surfaceInsets. + if (stack != null) { + final int outset = stack.getStackOutset(); + outPoint.offset(outset, outset); + } + // Expand for surface insets. See WindowState.expandForSurfaceInsets. outPoint.offset(-mAttrs.surfaceInsets.left, -mAttrs.surfaceInsets.top); } |