From 1cc1f3cec697bb9cb498033529525596c232f371 Mon Sep 17 00:00:00 2001 From: xinying Date: Wed, 26 Oct 2022 17:33:56 +0800 Subject: [PATCH] Attach the background-panel to DisplayContent. The background-panel is not attached to the DisplayContent, therefore the parent of its parent, BackgroundWindowManager, is null. This will result in the failure to record the screen and black screen. Therefore, we need to attach the background-panel to the displaycontent. bug: 254436057 Test: atest BackgroundWindowManagerTest Test: manual record screen and trigger one-handed mode Change-Id: I440feb76fdc59d73339770bba57857efa828c7d2 Signed-off-by: xinying --- .../src/com/android/wm/shell/dagger/WMShellModule.java | 4 +++- .../wm/shell/onehanded/BackgroundWindowManager.java | 8 +++++++- .../android/wm/shell/onehanded/OneHandedController.java | 5 ++++- .../wm/shell/onehanded/BackgroundWindowManagerTest.java | 5 ++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index f1670cd792cf8..4459f57a13566 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -27,6 +27,7 @@ import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.UiEventLogger; import com.android.internal.statusbar.IStatusBarService; import com.android.launcher3.icons.IconProvider; +import com.android.wm.shell.RootDisplayAreaOrganizer; import com.android.wm.shell.RootTaskDisplayAreaOrganizer; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.TaskViewTransitions; @@ -271,11 +272,12 @@ public abstract class WMShellModule { TaskStackListenerImpl taskStackListener, UiEventLogger uiEventLogger, InteractionJankMonitor jankMonitor, + RootDisplayAreaOrganizer rootDisplayAreaOrganizer, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler) { return OneHandedController.create(context, shellInit, shellCommandHandler, shellController, windowManager, displayController, displayLayout, taskStackListener, jankMonitor, - uiEventLogger, mainExecutor, mainHandler); + uiEventLogger, rootDisplayAreaOrganizer, mainExecutor, mainHandler); } // diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/BackgroundWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/BackgroundWindowManager.java index b310ee2095bff..b5ed509b6935e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/BackgroundWindowManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/BackgroundWindowManager.java @@ -34,6 +34,7 @@ import android.graphics.Rect; import android.os.Binder; import android.util.Slog; import android.view.ContextThemeWrapper; +import android.view.Display; import android.view.IWindow; import android.view.LayoutInflater; import android.view.SurfaceControl; @@ -47,6 +48,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.wm.shell.R; +import com.android.wm.shell.RootDisplayAreaOrganizer; import com.android.wm.shell.common.DisplayLayout; import java.io.PrintWriter; @@ -67,11 +69,14 @@ public final class BackgroundWindowManager extends WindowlessWindowManager { private SurfaceControl mLeash; private View mBackgroundView; private @OneHandedState.State int mCurrentState; + private RootDisplayAreaOrganizer mRootDisplayAreaOrganizer; - public BackgroundWindowManager(Context context) { + public BackgroundWindowManager(Context context, + RootDisplayAreaOrganizer rootDisplayAreaOrganizer) { super(context.getResources().getConfiguration(), null /* rootSurface */, null /* hostInputToken */); mContext = context; + mRootDisplayAreaOrganizer = rootDisplayAreaOrganizer; mTransactionFactory = SurfaceControl.Transaction::new; } @@ -112,6 +117,7 @@ public final class BackgroundWindowManager extends WindowlessWindowManager { .setOpaque(true) .setName(TAG) .setCallsite("BackgroundWindowManager#attachToParentSurface"); + mRootDisplayAreaOrganizer.attachToDisplayArea(Display.DEFAULT_DISPLAY, builder); mLeash = builder.build(); b.setParent(mLeash); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java index 679d4ca2ac488..ad135d1baa147 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java @@ -47,6 +47,7 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.UiEventLogger; import com.android.wm.shell.R; +import com.android.wm.shell.RootDisplayAreaOrganizer; import com.android.wm.shell.common.DisplayChangeController; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayLayout; @@ -204,12 +205,14 @@ public class OneHandedController implements RemoteCallable, DisplayController displayController, DisplayLayout displayLayout, TaskStackListenerImpl taskStackListener, InteractionJankMonitor jankMonitor, UiEventLogger uiEventLogger, + RootDisplayAreaOrganizer rootDisplayAreaOrganizer, ShellExecutor mainExecutor, Handler mainHandler) { OneHandedSettingsUtil settingsUtil = new OneHandedSettingsUtil(); OneHandedAccessibilityUtil accessibilityUtil = new OneHandedAccessibilityUtil(context); OneHandedTimeoutHandler timeoutHandler = new OneHandedTimeoutHandler(mainExecutor); OneHandedState oneHandedState = new OneHandedState(); - BackgroundWindowManager backgroundWindowManager = new BackgroundWindowManager(context); + BackgroundWindowManager backgroundWindowManager = + new BackgroundWindowManager(context, rootDisplayAreaOrganizer); OneHandedTutorialHandler tutorialHandler = new OneHandedTutorialHandler(context, settingsUtil, windowManager, backgroundWindowManager); OneHandedAnimationController animationController = diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/BackgroundWindowManagerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/BackgroundWindowManagerTest.java index f3f70673b332f..11948dbf96599 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/BackgroundWindowManagerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/BackgroundWindowManagerTest.java @@ -24,6 +24,7 @@ import androidx.test.annotation.UiThreadTest; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; +import com.android.wm.shell.RootDisplayAreaOrganizer; import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.common.DisplayLayout; @@ -41,11 +42,13 @@ public class BackgroundWindowManagerTest extends ShellTestCase { private BackgroundWindowManager mBackgroundWindowManager; @Mock private DisplayLayout mMockDisplayLayout; + @Mock + private RootDisplayAreaOrganizer mRootDisplayAreaOrganizer; @Before public void setup() { MockitoAnnotations.initMocks(this); - mBackgroundWindowManager = new BackgroundWindowManager(mContext); + mBackgroundWindowManager = new BackgroundWindowManager(mContext, mRootDisplayAreaOrganizer); mBackgroundWindowManager.onDisplayChanged(mMockDisplayLayout); }