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:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -265,7 +265,7 @@ final class InputManagerCallback implements InputManagerService.WindowManagerCal
|
||||
.setContainerLayer()
|
||||
.setName(name)
|
||||
.setCallsite("createSurfaceForGestureMonitor")
|
||||
.setParent(dc.getSurfaceControl())
|
||||
.setParent(dc.getOverlayLayer())
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -8246,7 +8246,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
.setContainerLayer()
|
||||
.setName("IME Handwriting Surface")
|
||||
.setCallsite("getHandwritingSurfaceForDisplay")
|
||||
.setParent(dc.getSurfaceControl())
|
||||
.setParent(dc.getOverlayLayer())
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user