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

Commit 1dc14aeb authored by Jeff Brown's avatar Jeff Brown Committed by Android (Google) Code Review
Browse files

Merge "Fix propagation of display overscan information."

parents 3bf09f77 ef981a40
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -995,8 +995,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {

    @Override
    public void setInitialDisplaySize(Display display, int width, int height, int density) {
        if (display.getDisplayId() != Display.DEFAULT_DISPLAY) {
            throw new IllegalArgumentException("Can only set the default display");
        // This method might be called before the policy has been fully initialized
        // or for other displays we don't care about.
        if (mContext == null || display.getDisplayId() != Display.DEFAULT_DISPLAY) {
            return;
        }
        mDisplay = display;

+4 −15
Original line number Diff line number Diff line
@@ -314,6 +314,9 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
     * to the display information synchronously so that applications will immediately
     * observe the new state.
     *
     * NOTE: This method must be the only entry point by which the window manager
     * influences the logical configuration of displays.
     *
     * @param displayId The logical display id.
     * @param info The new data to be stored.
     */
@@ -322,9 +325,7 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
        synchronized (mSyncRoot) {
            LogicalDisplay display = mLogicalDisplays.get(displayId);
            if (display != null) {
                mTempDisplayInfo.copyFrom(display.getDisplayInfoLocked());
                display.setDisplayInfoOverrideFromWindowManagerLocked(info);
                if (!mTempDisplayInfo.equals(display.getDisplayInfoLocked())) {
                if (display.setDisplayInfoOverrideFromWindowManagerLocked(info)) {
                    sendDisplayEventLocked(displayId, DisplayManagerGlobal.EVENT_DISPLAY_CHANGED);
                    scheduleTraversalLocked(false);
                }
@@ -332,18 +333,6 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
        }
    }

    /**
     * Sets the overscan insets for a particular display.
     */
    public void setOverscan(int displayId, int left, int top, int right, int bottom) {
        synchronized (mSyncRoot) {
            LogicalDisplay display = mLogicalDisplays.get(displayId);
            if (display != null) {
                display.setOverscan(left, top, right, bottom);
            }
        }
    }

    /**
     * Called by the window manager to perform traversals while holding a
     * surface flinger transaction.
+7 −15
Original line number Diff line number Diff line
@@ -128,32 +128,24 @@ final class LogicalDisplay {
     *
     * @param info The logical display information, may be null.
     */
    public void setDisplayInfoOverrideFromWindowManagerLocked(DisplayInfo info) {
    public boolean setDisplayInfoOverrideFromWindowManagerLocked(DisplayInfo info) {
        if (info != null) {
            if (mOverrideDisplayInfo == null) {
                mOverrideDisplayInfo = new DisplayInfo(info);
                mInfo = null;
            } else if (!mOverrideDisplayInfo.equals(info)) {
                return true;
            }
            if (!mOverrideDisplayInfo.equals(info)) {
                mOverrideDisplayInfo.copyFrom(info);
                mInfo = null;
                return true;
            }
        } else if (mOverrideDisplayInfo != null) {
            mOverrideDisplayInfo = null;
            mInfo = null;
            return true;
        }
    }

    public void setOverscan(int left, int top, int right, int bottom) {
        mInfo.overscanLeft = left;
        mInfo.overscanTop = top;
        mInfo.overscanRight = right;
        mInfo.overscanBottom = bottom;
        if (mOverrideDisplayInfo != null) {
            mOverrideDisplayInfo.overscanLeft = left;
            mOverrideDisplayInfo.overscanTop = top;
            mOverrideDisplayInfo.overscanRight = right;
            mOverrideDisplayInfo.overscanBottom = bottom;
        }
        return false;
    }

    /**
+43 −34
Original line number Diff line number Diff line
@@ -6961,12 +6961,7 @@ public class WindowManagerService extends IWindowManager.Stub
        synchronized(mWindowMap) {
            mIsTouchDevice = mContext.getPackageManager().hasSystemFeature(
                    PackageManager.FEATURE_TOUCHSCREEN);

            final DisplayContent displayContent = getDefaultDisplayContentLocked();
            mPolicy.setInitialDisplaySize(displayContent.getDisplay(),
                    displayContent.mInitialDisplayWidth,
                    displayContent.mInitialDisplayHeight,
                    displayContent.mInitialDisplayDensity);
            configureDisplayPolicyLocked(getDefaultDisplayContentLocked());
        }

        try {
@@ -7793,11 +7788,7 @@ public class WindowManagerService extends IWindowManager.Stub
    // displayContent must not be null
    private void reconfigureDisplayLocked(DisplayContent displayContent) {
        // TODO: Multidisplay: for now only use with default display.
        mPolicy.setInitialDisplaySize(displayContent.getDisplay(),
                displayContent.mBaseDisplayWidth,
                displayContent.mBaseDisplayHeight,
                displayContent.mBaseDisplayDensity);

        configureDisplayPolicyLocked(displayContent);
        displayContent.layoutNeeded = true;

        boolean configChanged = updateOrientationFromAppTokensLocked(false);
@@ -7818,6 +7809,18 @@ public class WindowManagerService extends IWindowManager.Stub
        performLayoutAndPlaceSurfacesLocked();
    }

    private void configureDisplayPolicyLocked(DisplayContent displayContent) {
        mPolicy.setInitialDisplaySize(displayContent.getDisplay(),
                displayContent.mBaseDisplayWidth,
                displayContent.mBaseDisplayHeight,
                displayContent.mBaseDisplayDensity);

        DisplayInfo displayInfo = displayContent.getDisplayInfo();
        mPolicy.setDisplayOverscan(displayContent.getDisplay(),
                displayInfo.overscanLeft, displayInfo.overscanTop,
                displayInfo.overscanRight, displayInfo.overscanBottom);
    }

    @Override
    public void setOverscan(int displayId, int left, int top, int right, int bottom) {
        if (mContext.checkCallingOrSelfPermission(
@@ -7829,7 +7832,13 @@ public class WindowManagerService extends IWindowManager.Stub
        synchronized(mWindowMap) {
            DisplayContent displayContent = getDisplayContentLocked(displayId);
            if (displayContent != null) {
                mDisplayManagerService.setOverscan(displayId, left, top, right, bottom);
                setOverscanLocked(displayContent, left, top, right, bottom);
            }
        }
    }

    private void setOverscanLocked(DisplayContent displayContent,
            int left, int top, int right, int bottom) {
        final DisplayInfo displayInfo = displayContent.getDisplayInfo();
        synchronized (displayContent.mDisplaySizeLock) {
            displayInfo.overscanLeft = left;
@@ -7837,13 +7846,11 @@ public class WindowManagerService extends IWindowManager.Stub
            displayInfo.overscanRight = right;
            displayInfo.overscanBottom = bottom;
        }
                mPolicy.setDisplayOverscan(displayContent.getDisplay(), left, top, right, bottom);
                displayContent.layoutNeeded = true;

        mDisplaySettings.setOverscanLocked(displayInfo.name, left, top, right, bottom);
        mDisplaySettings.writeSettingsLocked();
                performLayoutAndPlaceSurfacesLocked();
            }
        }

        reconfigureDisplayLocked(displayContent);
    }

    // -------------------------------------------------------------
@@ -10719,17 +10726,19 @@ public class WindowManagerService extends IWindowManager.Stub
        DisplayContent displayContent = new DisplayContent(display, this);
        final int displayId = display.getDisplayId();
        mDisplayContents.put(displayId, displayContent);

        DisplayInfo displayInfo = displayContent.getDisplayInfo();
        final Rect rect = new Rect();
        DisplayInfo info = displayContent.getDisplayInfo();
        mDisplaySettings.getOverscanLocked(info.name, rect);
        info.overscanLeft = rect.left;
        info.overscanTop = rect.top;
        info.overscanRight = rect.right;
        info.overscanBottom = rect.bottom;
        mDisplayManagerService.setOverscan(display.getDisplayId(), rect.left, rect.top,
                rect.right, rect.bottom);
        mPolicy.setDisplayOverscan(displayContent.getDisplay(), rect.left, rect.top,
                rect.right, rect.bottom);
        mDisplaySettings.getOverscanLocked(displayInfo.name, rect);
        synchronized (displayContent.mDisplaySizeLock) {
            displayInfo.overscanLeft = rect.left;
            displayInfo.overscanTop = rect.top;
            displayInfo.overscanRight = rect.right;
            displayInfo.overscanBottom = rect.bottom;
            mDisplayManagerService.setDisplayInfoOverrideFromWindowManager(
                    displayId, displayInfo);
        }
        configureDisplayPolicyLocked(displayContent);

        // TODO: Create an input channel for each display with touch capability.
        if (displayId == Display.DEFAULT_DISPLAY) {