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

Commit bce68144 authored by Kazuki Takise's avatar Kazuki Takise
Browse files

Fix crash in WindowDecoration

Ife0f85fdbd59b84303fc50f4ec896c53a259cec6 introduced a workaround
of registering a display listener when the display a task is on
isn't available when the task appears. However, the logic could
go into an infinite loop of:

(i) A display listener gets added
(ii) onDisplayAdded gets invoked, which triggers relayout
(iii) relayout() calls getDisplay() but it returns null, so goes
back to (i)

This change simply avoids this by making (i) asynchronous. Even
in the intended usage, we need to wait for the display to be added
anyway.

Flag: EXEMPT simple bug fix
Bug: 415631133
Test: CompatChangeTests#testSizeCompatDoesNotRestartWithDisplayMove
Test: WMShellUnitTests:WindowDecorationTests
Change-Id: I5de9302360a5f31dd6842f850a95163a3132f98b
parent af3aec1e
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -59,7 +59,8 @@ class DefaultWindowDecoration(
    displayController,
    taskSurface,
    surfaceControlSupplier,
    taskOrganizer
    taskOrganizer,
    handler,
) {

    /**
+5 −1
Original line number Diff line number Diff line
@@ -736,7 +736,11 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer>
    private boolean obtainDisplayOrRegisterListener() {
        mDisplay = mDisplayController.getDisplay(mTaskInfo.displayId);
        if (mDisplay == null) {
            mDisplayController.addDisplayWindowListener(mOnDisplaysChangedListener);
            // Post to the handler to avoid an infinite loop. See b/415631133 for more details.
            // TODO(b/419398609): Remove this whole work around once the root timing issue is
            //  resolved.
            mHandler.post(
                    () -> mDisplayController.addDisplayWindowListener(mOnDisplaysChangedListener));
            return false;
        }
        return true;
+9 −1
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.graphics.Rect
import android.graphics.Region
import android.gui.BorderSettings
import android.gui.BoxShadowSettings
import android.os.Handler
import android.view.Display
import android.view.InsetsSource
import android.view.InsetsState
@@ -45,6 +46,7 @@ import com.android.wm.shell.common.BoxShadowHelper
import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.common.DisplayController.OnDisplaysChangedListener
import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_WINDOW_DECORATION
import com.android.wm.shell.shared.annotations.ShellMainThread
import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalViewHostViewContainer
import com.android.wm.shell.windowdecor.caption.CaptionController
import com.android.wm.shell.windowdecor.extension.getDimensionPixelSize
@@ -72,6 +74,7 @@ abstract class WindowDecoration2<T>(
    taskSurface: SurfaceControl,
    surfaceControlSupplier: () -> SurfaceControl,
    private val taskOrganizer: ShellTaskOrganizer,
    @ShellMainThread private val handler: Handler,
    private val surfaceControlBuilderSupplier: () -> SurfaceControl.Builder =
        { SurfaceControl.Builder() },
    private val surfaceControlTransactionSupplier: () -> SurfaceControl.Transaction =
@@ -418,7 +421,12 @@ abstract class WindowDecoration2<T>(
    private fun obtainDisplayOrRegisterListener(): Boolean {
        display = displayController.getDisplay(taskInfo.displayId)
        if (display == null) {
            // Post to the handler to avoid an infinite loop. See b/415631133 for more details.
            // TODO(b/419398609): Remove this whole work around once the root timing issue is
            //  resolved.
            handler.post {
                displayController.addDisplayWindowListener(onDisplaysChangedListener)
            }
            return false
        }
        return true
+4 −4
Original line number Diff line number Diff line
@@ -60,8 +60,8 @@ import android.graphics.Insets;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Region;
import android.os.Handler;
import android.os.LocaleList;
import android.os.Looper;
import android.platform.test.annotations.UsesFlags;
import android.platform.test.flag.junit.FlagsParameterization;
import android.util.DisplayMetrics;
@@ -84,6 +84,7 @@ import androidx.test.filters.SmallTest;
import com.android.window.flags.Flags;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.TestHandler;
import com.android.wm.shell.TestRunningTaskInfoBuilder;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.desktopmode.DesktopModeEventLogger;
@@ -160,8 +161,6 @@ public class WindowDecorationTests extends ShellTestCase {
    @Mock
    private DesktopModeEventLogger mDesktopModeEventLogger;
    @Mock
    private Handler mMockHandler;
    @Mock
    private Transitions mTransitions;

    private final List<SurfaceControl.Transaction> mMockSurfaceControlTransactions =
@@ -173,6 +172,7 @@ public class WindowDecorationTests extends ShellTestCase {
    private SurfaceControl.Transaction mMockSurfaceControlAddWindowT;
    private WindowDecoration.RelayoutParams mRelayoutParams = new WindowDecoration.RelayoutParams();
    private int mCaptionMenuWidthId;
    private final TestHandler mTestHandler = new TestHandler(Looper.getMainLooper());

    public WindowDecorationTests(FlagsParameterization flags) {
        mSetFlagsRule.setFlagsParameterization(flags);
@@ -1305,7 +1305,7 @@ public class WindowDecorationTests extends ShellTestCase {
                @NonNull WindowDecorViewHostSupplier<WindowDecorViewHost>
                        windowDecorViewHostSupplier,
                DesktopModeEventLogger desktopModeEventLogger) {
            super(context, mMockHandler, mTransitions, userContext, displayController,
            super(context, mTestHandler, mTransitions, userContext, displayController,
                    taskOrganizer, taskInfo, taskSurface, surfaceControlBuilderSupplier,
                    surfaceControlTransactionSupplier, windowContainerTransactionSupplier,
                    surfaceControlSupplier, surfaceControlViewHostFactory,