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

Commit b660b9d8 authored by Craig Mautner's avatar Craig Mautner
Browse files

Update DimLayer sizes on rotation.

Required replumbing and updating the TaskStack bounds calculations
to match the new separation of TaskStack from DisplayContent.

Fixes bug 12780687.

Change-Id: I061c92831c06f4eb3e673ad6296e721b0c0f3202
parent 3cb62db2
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -127,6 +127,11 @@ public class DimLayer {

    void setBounds(Rect bounds) {
        mBounds.set(bounds);
        if (isDimming() && !mLastBounds.equals(bounds)) {
            // Clearing mAlpha forces show to redisplay with new size. 
            mAlpha = 0;
            show();
        }
    }

    /**
+5 −13
Original line number Diff line number Diff line
@@ -170,22 +170,13 @@ class DisplayContent {
    }

    void updateDisplayInfo() {
        // Save old size.
        int oldWidth = mDisplayInfo.logicalWidth;
        int oldHeight = mDisplayInfo.logicalHeight;
        mDisplay.getDisplayInfo(mDisplayInfo);

        for (int i = mStacks.size() - 1; i >= 0; --i) {
            final TaskStack stack = mStacks.get(i);
            if (!stack.isFullscreen()) {
                stack.resizeBounds(oldWidth, oldHeight, mDisplayInfo.logicalWidth,
                        mDisplayInfo.logicalHeight);
            }
            mStacks.get(i).updateDisplayInfo();
        }
    }

    void getLogicalDisplayRect(Rect out) {
        updateDisplayInfo();
        // Uses same calculation as in LogicalDisplay#configureDisplayInTransactionLocked.
        final int orientation = mDisplayInfo.rotation;
        boolean rotated = (orientation == Surface.ROTATION_90
@@ -291,11 +282,12 @@ class DisplayContent {
    }

    boolean isDimming() {
        boolean result = false;
        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
            result |= mStacks.get(stackNdx).isDimming();
            if (mStacks.get(stackNdx).isDimming()) {
                return true;
            }
        return result;
        }
        return false;
    }

    void stopDimmingIfNeeded() {
+26 −30
Original line number Diff line number Diff line
@@ -47,12 +47,17 @@ public class TaskStack {
     * mTaskHistory in the ActivityStack with the same mStackId */
    private final ArrayList<Task> mTasks = new ArrayList<Task>();

    /** Content limits relative to the DisplayContent this sits in. Empty indicates fullscreen,
     * Nonempty is size of this TaskStack but is also used to scale if DisplayContent changes. */
    Rect mBounds = new Rect();
    /** For comparison with DisplayContent bounds. */
    private Rect mTmpRect = new Rect();

    /** Content limits relative to the DisplayContent this sits in. */
    private Rect mBounds = new Rect();

    /** Whether mBounds is fullscreen */
    private boolean mFullscreen = true;

    /** Used to support {@link android.view.WindowManager.LayoutParams#FLAG_DIM_BEHIND} */
    DimLayer mDimLayer;
    private DimLayer mDimLayer;

    /** The particular window with FLAG_DIM_BEHIND set. If null, hide mDimLayer. */
    WindowStateAnimator mDimWinAnimator;
@@ -86,7 +91,7 @@ public class TaskStack {
        return mTasks;
    }

    private void resizeWindows() {
    void resizeWindows() {
        final boolean underStatusBar = mBounds.top == 0;

        final ArrayList<WindowState> resizingWindows = mService.mResizingWindows;
@@ -108,7 +113,13 @@ public class TaskStack {
    }

    boolean setBounds(Rect bounds) {
        if (mBounds.equals(bounds)) {
        boolean oldFullscreen = mFullscreen;
        if (mDisplayContent != null) {
            mDisplayContent.getLogicalDisplayRect(mTmpRect);
            mFullscreen = mTmpRect.equals(bounds);
        }

        if (mBounds.equals(bounds) && oldFullscreen == mFullscreen) {
            return false;
        }

@@ -116,25 +127,22 @@ public class TaskStack {
        mAnimationBackgroundSurface.setBounds(bounds);
        mBounds.set(bounds);

        resizeWindows();
        return true;
    }

    void getBounds(Rect out) {
        if (mDisplayContent != null) {
            if (mBounds.isEmpty()) {
                mDisplayContent.getLogicalDisplayRect(out);
            } else {
        out.set(mBounds);
    }
            out.intersect(mDisplayContent.mContentRect);
        } else {
            out.set(mBounds);

    void updateDisplayInfo() {
        if (mFullscreen && mDisplayContent != null) {
            mDisplayContent.getLogicalDisplayRect(mTmpRect);
            setBounds(mTmpRect);
        }
    }

    boolean isFullscreen() {
        return mBounds.isEmpty();
        return mFullscreen;
    }

    boolean isAnimating() {
@@ -152,19 +160,6 @@ public class TaskStack {
        return false;
    }

    void resizeBounds(float oldWidth, float oldHeight, float newWidth, float newHeight) {
        if (oldWidth == newWidth && oldHeight == newHeight) {
            return;
        }
        float widthScale = newWidth / oldWidth;
        float heightScale = newHeight / oldHeight;
        mBounds.left = (int)(mBounds.left * widthScale + 0.5);
        mBounds.top = (int)(mBounds.top * heightScale + 0.5);
        mBounds.right = (int)(mBounds.right * widthScale + 0.5);
        mBounds.bottom = (int)(mBounds.bottom * heightScale + 0.5);
        resizeWindows();
    }

    /**
     * Put a Task in this stack. Used for adding and moving.
     * @param task The task to add.
@@ -233,6 +228,7 @@ public class TaskStack {
        mDisplayContent = displayContent;
        mDimLayer = new DimLayer(mService, this, displayContent);
        mAnimationBackgroundSurface = new DimLayer(mService, this, displayContent);
        updateDisplayInfo();
    }

    void detachDisplay() {
+2 −0
Original line number Diff line number Diff line
@@ -4986,6 +4986,7 @@ public class WindowManagerService extends IWindowManager.Stub
                        + " not found.");
            }
            if (stack.setBounds(bounds)) {
                stack.resizeWindows();
                stack.getDisplayContent().layoutNeeded = true;
                performLayoutAndPlaceSurfacesLocked();
            }
@@ -9957,6 +9958,7 @@ public class WindowManagerService extends IWindowManager.Stub
            }

            // TODO(multidisplay): rotation on main screen only.
            displayContent.updateDisplayInfo();
            screenRotationAnimation = new ScreenRotationAnimation(mContext, displayContent,
                    mFxSession, inTransaction, mPolicy.isDefaultOrientationForced());
            mAnimator.setScreenRotationAnimationLocked(displayId, screenRotationAnimation);