Change Rounded corner overlay to be in Overlay layer

Rounded corner overlay should be topmost visible window in overlay
layer. Only Input gesture windows can be higher in hierarchy than
rounded corner overlay.

Test: Manual
Bug: 225505986
Change-Id: I7bf2380edbb8267347a8ded53b0755524f6781f5
Merged-In: I7bf2380edbb8267347a8ded53b0755524f6781f5
(cherry picked from commit 0809288dfd)
This commit is contained in:
Vaibhav Devmurari
2022-05-19 16:20:39 +00:00
parent 4f677e9d79
commit 5394e3b2d2
8 changed files with 31 additions and 6 deletions

View File

@@ -27,6 +27,8 @@ import android.view.InputWindowHandle;
import android.view.SurfaceControl;
import android.view.WindowManager;
import com.android.server.policy.WindowManagerPolicy;
/**
* An internal implementation of an {@link InputMonitor} that uses a spy window.
*
@@ -67,7 +69,9 @@ class GestureMonitorSpyWindow {
final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
t.setInputWindowInfo(mInputSurface, mWindowHandle);
t.setLayer(mInputSurface, Integer.MAX_VALUE);
// Gesture monitor should be above handwriting event surface, hence setting it to
// WindowManagerPolicy.INPUT_DISPLAY_OVERLAY_LAYER + 1
t.setLayer(mInputSurface, WindowManagerPolicy.INPUT_DISPLAY_OVERLAY_LAYER + 1);
t.setPosition(mInputSurface, 0, 0);
t.setCrop(mInputSurface, null /* crop to parent surface */);
t.show(mInputSurface);

View File

@@ -27,6 +27,8 @@ import android.view.InputWindowHandle;
import android.view.SurfaceControl;
import android.view.WindowManager;
import com.android.server.policy.WindowManagerPolicy;
final class HandwritingEventReceiverSurface {
public static final String TAG = HandwritingEventReceiverSurface.class.getSimpleName();
@@ -36,7 +38,8 @@ final class HandwritingEventReceiverSurface {
// is above gesture monitors, then edge-back and swipe-up gestures won't work when this surface
// is intercepting.
// TODO(b/217538817): Specify the ordering in WM by usage.
private static final int HANDWRITING_SURFACE_LAYER = Integer.MAX_VALUE - 1;
private static final int HANDWRITING_SURFACE_LAYER =
WindowManagerPolicy.INPUT_DISPLAY_OVERLAY_LAYER;
private final InputWindowHandle mWindowHandle;
private final InputChannel mClientChannel;

View File

@@ -155,6 +155,10 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
int FINISH_LAYOUT_REDO_ANIM = 0x0008;
/** Layer for the screen off animation */
int COLOR_FADE_LAYER = 0x40000001;
/** Layer for Input overlays for capturing inputs for gesture detection, etc. */
int INPUT_DISPLAY_OVERLAY_LAYER = 0x7f000000;
/** Layer for Screen Decoration: The top most visible layer just below input overlay layers */
int SCREEN_DECOR_DISPLAY_OVERLAY_LAYER = INPUT_DISPLAY_OVERLAY_LAYER - 1;
/**
* Register shortcuts for window manager to dispatch.

View File

@@ -5414,6 +5414,16 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
return mOverlayLayer;
}
SurfaceControl[] findRoundedCornerOverlays() {
List<SurfaceControl> roundedCornerOverlays = new ArrayList<>();
for (WindowToken token : mTokenMap.values()) {
if (token.mRoundedCornerOverlay) {
roundedCornerOverlays.add(token.mSurfaceControl);
}
}
return roundedCornerOverlays.toArray(new SurfaceControl[0]);
}
/**
* Updates the display's system gesture exclusion.
*

View File

@@ -265,7 +265,7 @@ final class InputManagerCallback implements InputManagerService.WindowManagerCal
.setContainerLayer()
.setName(name)
.setCallsite("createSurfaceForGestureMonitor")
.setParent(dc.getSurfaceControl())
.setParent(dc.getOverlayLayer())
.build();
}
}

View File

@@ -164,6 +164,10 @@ class ScreenRotationAnimation {
.setCaptureSecureLayers(true)
.setAllowProtected(true)
.setSourceCrop(new Rect(0, 0, width, height))
// Exclude rounded corner overlay from screenshot buffer. Rounded
// corner overlay windows are un-rotated during rotation animation
// for a seamless transition.
.setExcludeLayers(displayContent.findRoundedCornerOverlays())
.build();
SurfaceControl.ScreenshotHardwareBuffer screenshotBuffer =
SurfaceControl.captureLayers(args);

View File

@@ -8246,7 +8246,7 @@ public class WindowManagerService extends IWindowManager.Stub
.setContainerLayer()
.setName("IME Handwriting Surface")
.setCallsite("getHandwritingSurfaceForDisplay")
.setParent(dc.getSurfaceControl())
.setParent(dc.getOverlayLayer())
.build();
}
}

View File

@@ -364,7 +364,7 @@ class WindowToken extends WindowContainer<WindowState> {
@Override
void assignLayer(SurfaceControl.Transaction t, int layer) {
if (mRoundedCornerOverlay) {
super.assignLayer(t, WindowManagerPolicy.COLOR_FADE_LAYER + 1);
super.assignLayer(t, WindowManagerPolicy.SCREEN_DECOR_DISPLAY_OVERLAY_LAYER);
} else {
super.assignLayer(t, layer);
}
@@ -374,7 +374,7 @@ class WindowToken extends WindowContainer<WindowState> {
SurfaceControl.Builder makeSurface() {
final SurfaceControl.Builder builder = super.makeSurface();
if (mRoundedCornerOverlay) {
builder.setParent(null);
builder.setParent(getDisplayContent().getOverlayLayer());
}
return builder;
}