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

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

Check return values for null.

When a Display has been removed there is a delay until all of its
windows have been removed. Therefore there is a possibility that
WindowState.getDisplayContent() returns null. Guard against that
possibility.

Fixes bug 13616765.

Change-Id: Ia2074d293b0e1bd4ca2cd14aeb4a2cc09ed9f41e
parent 79e6578b
Loading
Loading
Loading
Loading
+13 −1
Original line number Original line Diff line number Diff line
@@ -917,6 +917,10 @@ public class WindowManagerService extends IWindowManager.Stub
        final IWindow client = win.mClient;
        final IWindow client = win.mClient;
        final WindowToken token = win.mToken;
        final WindowToken token = win.mToken;
        final DisplayContent displayContent = win.getDisplayContent();
        final DisplayContent displayContent = win.getDisplayContent();
        if (displayContent == null) {
            // It doesn't matter this display is going away.
            return 0;
        }


        final WindowList windows = win.getWindowList();
        final WindowList windows = win.getWindowList();
        final int N = windows.size();
        final int N = windows.size();
@@ -1094,6 +1098,9 @@ public class WindowManagerService extends IWindowManager.Stub
    private void addAttachedWindowToListLocked(final WindowState win, boolean addToToken) {
    private void addAttachedWindowToListLocked(final WindowState win, boolean addToToken) {
        final WindowToken token = win.mToken;
        final WindowToken token = win.mToken;
        final DisplayContent displayContent = win.getDisplayContent();
        final DisplayContent displayContent = win.getDisplayContent();
        if (displayContent == null) {
            return;
        }
        final WindowState attached = win.mAttachedWindow;
        final WindowState attached = win.mAttachedWindow;


        WindowList tokenWindowList = getTokenWindowsOnDisplay(token, displayContent);
        WindowList tokenWindowList = getTokenWindowsOnDisplay(token, displayContent);
@@ -2251,6 +2258,11 @@ public class WindowManagerService extends IWindowManager.Stub
                return WindowManagerGlobal.ADD_APP_EXITING;
                return WindowManagerGlobal.ADD_APP_EXITING;
            }
            }


            if (win.getDisplayContent() == null) {
                Slog.w(TAG, "Adding window to Display that has been removed.");
                return WindowManagerGlobal.ADD_INVALID_DISPLAY;
            }

            mPolicy.adjustWindowParamsLw(win.mAttrs);
            mPolicy.adjustWindowParamsLw(win.mAttrs);
            win.setShowToOwnerOnlyLocked(mPolicy.checkShowToOwnerOnly(attrs));
            win.setShowToOwnerOnlyLocked(mPolicy.checkShowToOwnerOnly(attrs));


@@ -2744,7 +2756,7 @@ public class WindowManagerService extends IWindowManager.Stub
            return;
            return;
        }
        }


        final DisplayInfo displayInfo = window.getDisplayContent().getDisplayInfo();
        final DisplayInfo displayInfo = displayContent.getDisplayInfo();
        final RectF dispRect = new RectF(0, 0,
        final RectF dispRect = new RectF(0, 0,
                displayInfo.logicalWidth, displayInfo.logicalHeight);
                displayInfo.logicalWidth, displayInfo.logicalHeight);
        matrix.mapRect(dispRect);
        matrix.mapRect(dispRect);
+9 −3
Original line number Original line Diff line number Diff line
@@ -171,9 +171,15 @@ class WindowStateAnimator {
        mAnimator = service.mAnimator;
        mAnimator = service.mAnimator;
        mPolicy = service.mPolicy;
        mPolicy = service.mPolicy;
        mContext = service.mContext;
        mContext = service.mContext;
        final DisplayInfo displayInfo = win.getDisplayContent().getDisplayInfo();
        final DisplayContent displayContent = win.getDisplayContent();
        if (displayContent != null) {
            final DisplayInfo displayInfo = displayContent.getDisplayInfo();
            mAnimDw = displayInfo.appWidth;
            mAnimDw = displayInfo.appWidth;
            mAnimDh = displayInfo.appHeight;
            mAnimDh = displayInfo.appHeight;
        } else {
            Slog.w(TAG, "WindowStateAnimator ctor: Display has been removed");
            // This is checked on return and dealt with.
        }


        mWin = win;
        mWin = win;
        mAttachedWinAnimator = win.mAttachedWindow == null
        mAttachedWinAnimator = win.mAttachedWindow == null