summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Robert Carr <racarr@google.com> 2018-01-29 15:03:23 -0800
committer Robert Carr <racarr@google.com> 2018-01-31 12:39:46 -0800
commit32bcb10e336741c8e43a35ee1048c7ce36257e39 (patch)
tree5eeae7a6fdb42d892e73b77a71f9ec8db5357bec
parentf0586626e5955b183c11f46a9d04886f4b300209 (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
-rw-r--r--core/java/android/app/WindowConfiguration.java3
-rw-r--r--core/java/com/android/internal/policy/DecorView.java3
-rw-r--r--services/core/java/com/android/server/wm/TaskStack.java32
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java11
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);
}