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

Commit 5838d680 authored by Santos Cordon's avatar Santos Cordon
Browse files

Integrate LogicalDisplayMapper with DisplayFoldController.

Test: Manual - ensure folding mechanism still works
Bug: 130724654
Change-Id: I5fe88e2635ed2b1731ac2f1a197b6b99e18d4ebc
parent d8232c72
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -266,12 +266,6 @@ public abstract class DisplayManagerInternal {
     */
    public abstract void ignoreProximitySensorUntilChanged();

    /**
     * Sets the folded state of the device.
     * TODO: b/168208522 - Remove in favor of DisplayStatePolicy when that is available.
     */
    public abstract void setDeviceFolded(boolean isFolded);

    /**
     * Describes the requested power state of the display.
     *
+23 −7
Original line number Diff line number Diff line
@@ -91,6 +91,7 @@ import android.util.SparseArray;
import android.util.Spline;
import android.view.Display;
import android.view.DisplayInfo;
import android.view.IDisplayFoldListener;
import android.view.Surface;
import android.view.SurfaceControl;

@@ -103,6 +104,7 @@ import com.android.server.DisplayThread;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.UiThread;
import com.android.server.policy.WindowManagerPolicy;
import com.android.server.wm.SurfaceAnimationThread;
import com.android.server.wm.WindowManagerInternal;

@@ -312,6 +314,9 @@ public final class DisplayManagerService extends SystemService {
    // Receives notifications about changes to Settings.
    private SettingsObserver mSettingsObserver;

    // Received notifications of the display-fold action
    private DisplayFoldListener mDisplayFoldListener;

    public DisplayManagerService(Context context) {
        this(context, new Injector());
    }
@@ -429,6 +434,11 @@ public final class DisplayManagerService extends SystemService {
        synchronized (mSyncRoot) {
            mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
            mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
            WindowManagerPolicy policy = LocalServices.getService(WindowManagerPolicy.class);

            mDisplayFoldListener = new DisplayFoldListener();
            policy.registerDisplayFoldListener(mDisplayFoldListener);

            scheduleTraversalLocked(false);
        }
    }
@@ -2563,13 +2573,6 @@ public final class DisplayManagerService extends SystemService {
        public void ignoreProximitySensorUntilChanged() {
            mDisplayPowerController.ignoreProximitySensorUntilChanged();
        }

        @Override
        public void setDeviceFolded(boolean isFolded) {
            synchronized (mSyncRoot) {
                mLogicalDisplayMapper.setDeviceFoldedLocked(isFolded);
            }
        }
    }

    class DesiredDisplayModeSpecsObserver
@@ -2606,4 +2609,17 @@ public final class DisplayManagerService extends SystemService {
            }
        }
    }

    class DisplayFoldListener extends IDisplayFoldListener.Stub {
        @Override
        public void onDisplayFoldChanged(int displayId, boolean folded) {
            // TODO: multi-display - IDisplayFoldListener callback only really works for the
            // Display.DEFAULT_DISPLAY.
            if (displayId == Display.DEFAULT_DISPLAY) {
                synchronized (mSyncRoot) {
                    mLogicalDisplayMapper.setDeviceFoldedLocked(folded);
                }
            }
        }
    };
}
+25 −25
Original line number Diff line number Diff line
@@ -167,7 +167,31 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener {
        }
    }

    public void setDeviceFoldedLocked(boolean isFolded) {
    public void dumpLocked(PrintWriter pw) {
        pw.println("LogicalDisplayMapper:");
        IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "  ");
        ipw.increaseIndent();

        ipw.println("mSingleDisplayDemoMode=" + mSingleDisplayDemoMode);
        ipw.println("mNextNonDefaultDisplayId=" + mNextNonDefaultDisplayId);

        final int logicalDisplayCount = mLogicalDisplays.size();
        ipw.println();
        ipw.println("Logical Displays: size=" + logicalDisplayCount);


        for (int i = 0; i < logicalDisplayCount; i++) {
            int displayId = mLogicalDisplays.keyAt(i);
            LogicalDisplay display = mLogicalDisplays.valueAt(i);
            ipw.println("Display " + displayId + ":");
            ipw.increaseIndent();
            display.dumpLocked(ipw);
            ipw.decreaseIndent();
            ipw.println();
        }
    }

    void setDeviceFoldedLocked(boolean isFolded) {
        mIsFolded = isFolded;
        if (mIsFoldedOverride != null) {
            isFolded = mIsFoldedOverride.booleanValue();
@@ -237,30 +261,6 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener {
        }
    }

    public void dumpLocked(PrintWriter pw) {
        pw.println("LogicalDisplayMapper:");
        IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "  ");
        ipw.increaseIndent();

        ipw.println("mSingleDisplayDemoMode=" + mSingleDisplayDemoMode);
        ipw.println("mNextNonDefaultDisplayId=" + mNextNonDefaultDisplayId);

        final int logicalDisplayCount = mLogicalDisplays.size();
        ipw.println();
        ipw.println("Logical Displays: size=" + logicalDisplayCount);


        for (int i = 0; i < logicalDisplayCount; i++) {
            int displayId = mLogicalDisplays.keyAt(i);
            LogicalDisplay display = mLogicalDisplays.valueAt(i);
            ipw.println("Display " + displayId + ":");
            ipw.increaseIndent();
            display.dumpLocked(ipw);
            ipw.decreaseIndent();
            ipw.println();
        }
    }

    void setFoldOverrideLocked(Boolean isFolded) {
        if (!Objects.equals(isFolded, mIsFoldedOverride)) {
            mIsFoldedOverride = isFolded;
+30 −25
Original line number Diff line number Diff line
@@ -80,22 +80,25 @@ class DisplayFoldController {
    }

    void setDeviceFolded(boolean folded) {
        mDisplayManagerInternal.setDeviceFolded(folded);

        if (mFolded != null && mFolded == folded) {
            return;
        }
        if (folded) {
            Rect foldedArea;

        final Rect foldedArea;
        if (!mOverrideFoldedArea.isEmpty()) {
            foldedArea = mOverrideFoldedArea;
        } else if (!mFoldedArea.isEmpty()) {
            foldedArea = mFoldedArea;
        } else {
                return;
            foldedArea = null;
        }

            mDisplayManagerInternal.getNonOverrideDisplayInfo(mDisplayId, mNonOverrideDisplayInfo);
        // Only do display scaling/cropping if it has been configured to do so
        if (foldedArea != null) {
            if (folded) {

                mDisplayManagerInternal.getNonOverrideDisplayInfo(
                        mDisplayId, mNonOverrideDisplayInfo);
                final int dx = (mNonOverrideDisplayInfo.logicalWidth - foldedArea.width()) / 2
                        - foldedArea.left;
                final int dy = (mNonOverrideDisplayInfo.logicalHeight - foldedArea.height()) / 2
@@ -111,6 +114,8 @@ class DisplayFoldController {
                mWindowManagerInternal.clearForcedDisplaySize(mDisplayId);
                mDisplayManagerInternal.setDisplayOffsets(mDisplayId, 0, 0);
            }
        }

        mDurationLogger.setDeviceFolded(folded);
        mDurationLogger.logFocusedAppWithFoldState(folded, mFocusedApp);
        mFolded = folded;
+0 −5
Original line number Diff line number Diff line
@@ -471,7 +471,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    int mLidKeyboardAccessibility;
    int mLidNavigationAccessibility;
    private boolean mLidControlsDisplayFold;
    private boolean mShouldSwapDisplaysOnLidSwitch;
    int mShortPressOnPowerBehavior;
    int mLongPressOnPowerBehavior;
    int mVeryLongPressOnPowerBehavior;
@@ -1849,8 +1848,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                com.android.internal.R.integer.config_lidNavigationAccessibility);
        mLidControlsDisplayFold = mContext.getResources().getBoolean(
                com.android.internal.R.bool.config_lidControlsDisplayFold);
        mShouldSwapDisplaysOnLidSwitch = mContext.getResources().getStringArray(
                com.android.internal.R.array.config_internalFoldedPhysicalDisplayIds).length == 2;

        mAllowTheaterModeWakeFromKey = mContext.getResources().getBoolean(
                com.android.internal.R.bool.config_allowTheaterModeWakeFromKey);
@@ -5041,8 +5038,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        final int lidState = mDefaultDisplayPolicy.getLidState();
        if (mLidControlsDisplayFold && mDisplayFoldController != null) {
            mDisplayFoldController.requestDeviceFolded(lidState == LID_CLOSED);
        } else if (mShouldSwapDisplaysOnLidSwitch) {
            mDisplayManagerInternal.setDeviceFolded(lidState == LID_CLOSED);
        } else if (lidState == LID_CLOSED) {
            int lidBehavior = getLidBehavior();
            switch (lidBehavior) {