Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 50f53e88 authored by Jacky Kao's avatar Jacky Kao
Browse files

Revert "Use shellRoot to identify PIP menu window"

Revert submission 16249364-Surface Flinger

Reason for revert: Large increase (~200%) in system_server memory usage (b/214255324)
Reverted Changes:
I14c5e9889:Apply display transform to window bounds and node ...
I0ac0d0487:Use shellRoot to identify PIP menu window
I83e898d91:Uses SF callback windows for the A11yWindowInfo [2...
I94d7ed4fb:Uses SF callback windows for the A11yWindowInfo [1...

Change-Id: I715c128560cda3af29030e36264fa7ac6a241afa
parent df407d1d
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -1645,11 +1645,10 @@ final class AccessibilityController {

            // Ignore non-touchable windows, except the split-screen divider, which is
            // occasionally non-touchable but still useful for identifying split-screen
            // mode and the PIP menu.
            // mode.
            if (((a11yWindow.getFlags()
                    & WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) != 0)
                    && (a11yWindow.getType() != TYPE_DOCK_DIVIDER
                    && !a11yWindow.isPIPMenu())) {
                    && (a11yWindow.getType() != TYPE_DOCK_DIVIDER)) {
                return false;
            }

+6 −21
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.util.Slog;
@@ -105,14 +104,9 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener {
            inverseMatrix.set(mMagnificationSpecInverseMatrix.get(displayId));
        }

        final DisplayContent dc = mService.mRoot.getDisplayContent(displayId);
        final ShellRoot shellroot = dc.mShellRoots.get(WindowManager.SHELL_ROOT_LAYER_PIP);
        final IBinder pipMenuIBinder =
                shellroot != null ? shellroot.getAccessibilityWindowToken() : null;
        for (final InputWindowHandle windowHandle : inputWindowHandles) {
            final AccessibilityWindow accessibilityWindow =
                    AccessibilityWindow.initializeData(mService, windowHandle, inverseMatrix,
                            pipMenuIBinder);
                    AccessibilityWindow.initializeData(mService, windowHandle, inverseMatrix);

            outWindows.add(accessibilityWindow);
        }
@@ -340,7 +334,6 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener {
        private int mFlags;
        private int mType;
        private int mPrivateFlags;
        private boolean mIsPIPMenu;
        private boolean mIsFocused;
        private boolean mShouldMagnify;
        private boolean mIgnoreDuetoRecentsAnimation;
@@ -357,7 +350,7 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener {
         * @param inverseMatrix The magnification spec inverse matrix.
         */
        public static AccessibilityWindow initializeData(WindowManagerService service,
                InputWindowHandle inputWindowHandle, Matrix inverseMatrix, IBinder pipIBinder) {
                InputWindowHandle inputWindowHandle, Matrix inverseMatrix) {
            final IWindow window = inputWindowHandle.getWindow();
            final WindowState windowState = window != null ? service.mWindowMap.get(
                    window.asBinder()) : null;
@@ -368,7 +361,6 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener {
            instance.mDisplayId = inputWindowHandle.displayId;
            instance.mFlags = inputWindowHandle.layoutParamsFlags;
            instance.mType = inputWindowHandle.layoutParamsType;
            instance.mIsPIPMenu = inputWindowHandle.getWindow().asBinder().equals(pipIBinder);

            // TODO (b/199357848): gets the private flag of the window from other way.
            instance.mPrivateFlags = windowState != null ? windowState.mAttrs.privateFlags : 0;
@@ -499,13 +491,6 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener {
            return mTouchableRegionInScreen.isEmpty();
        }

        /**
         * @return true if this window is PIP menu.
         */
        public boolean isPIPMenu() {
            return mIsPIPMenu;
        }

        private static void getTouchableRegionInWindow(boolean shouldMagnify, Region inRegion,
                Region outRegion, Rect frame, Matrix inverseMatrix) {
            // Some modal windows, like the activity with Theme.dialog, has the full screen
@@ -562,9 +547,10 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener {
            // one is PIP.
            if (windowInfo.type == TYPE_DOCK_DIVIDER) {
                windowInfo.title = "Splitscreen Divider";
            } else if (window.mIsPIPMenu) {
            } else {
                windowInfo.title = "Picture-in-Picture menu";
            }

            return windowInfo;
        }

@@ -579,19 +565,18 @@ public final class AccessibilityWindowsPopulator extends WindowInfosListener {

        @Override
        public String toString() {
            String builder = "A11yWindow=[" + mWindow.asBinder()
            String builder = "A11yWindow=[" + mWindow
                    + ", displayId=" + mDisplayId
                    + ", flag=0x" + Integer.toHexString(mFlags)
                    + ", type=" + mType
                    + ", privateFlag=0x" + Integer.toHexString(mPrivateFlags)
                    + ", focused=" + mIsFocused
                    + ", mShouldMagnify=" + mShouldMagnify
                    + ", magnify=" + mShouldMagnify
                    + ", ignoreDuetoRecentsAnimation=" + mIgnoreDuetoRecentsAnimation
                    + ", mIsTrustedOverlay=" + mIsTrustedOverlay
                    + ", regionInScreen=" + mTouchableRegionInScreen
                    + ", touchableRegion=" + mTouchableRegionInWindow
                    + ", letterBoxBounds=" + mLetterBoxBounds
                    + ", isPIPMenu=" + mIsPIPMenu
                    + ", windowInfo=" + mWindowInfo
                    + "]";

+42 −6
Original line number Diff line number Diff line
@@ -25,14 +25,15 @@ import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_WINDOW_ANIMAT
import static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
import android.view.DisplayInfo;
import android.view.IWindow;
import android.view.SurfaceControl;
import android.view.WindowInfo;
import android.view.WindowManager;
import android.view.animation.Animation;

@@ -135,13 +136,48 @@ public class ShellRoot {
                ANIMATION_TYPE_WINDOW_ANIMATION);
    }

    @Nullable
    IBinder getAccessibilityWindowToken() {
        if (mAccessibilityWindow != null) {
            return mAccessibilityWindow.asBinder();
    WindowInfo getWindowInfo() {
        if (mShellRootLayer != SHELL_ROOT_LAYER_DIVIDER
                && mShellRootLayer != SHELL_ROOT_LAYER_PIP) {
            return null;
        }
        if (mShellRootLayer == SHELL_ROOT_LAYER_DIVIDER
                && !mDisplayContent.getDefaultTaskDisplayArea().isSplitScreenModeActivated()) {
            return null;
        }
        if (mShellRootLayer == SHELL_ROOT_LAYER_PIP
                && mDisplayContent.getDefaultTaskDisplayArea().getRootPinnedTask() == null) {
            return null;
        }
        if (mAccessibilityWindow == null) {
            return null;
        }
        WindowInfo windowInfo = WindowInfo.obtain();
        windowInfo.displayId = mToken.getDisplayArea().getDisplayContent().mDisplayId;
        windowInfo.type = mToken.windowType;
        windowInfo.layer = mToken.getWindowLayerFromType();
        windowInfo.token = mAccessibilityWindow.asBinder();
        windowInfo.focused = false;
        windowInfo.hasFlagWatchOutsideTouch = false;
        final Rect regionRect = new Rect();


        // DividerView
        if (mShellRootLayer == SHELL_ROOT_LAYER_DIVIDER) {
            windowInfo.inPictureInPicture = false;
            mDisplayContent.getDockedDividerController().getTouchRegion(regionRect);
            windowInfo.regionInScreen.set(regionRect);
            windowInfo.title = "Splitscreen Divider";
        }
        // PipMenuView
        if (mShellRootLayer == SHELL_ROOT_LAYER_PIP) {
            windowInfo.inPictureInPicture = true;
            mDisplayContent.getDefaultTaskDisplayArea().getRootPinnedTask().getBounds(regionRect);
            windowInfo.regionInScreen.set(regionRect);
            windowInfo.title = "Picture-in-Picture menu";
        }
        return windowInfo;
    }

    void setAccessibilityWindow(IWindow window) {
        if (mAccessibilityWindow != null) {