diff options
13 files changed, 106 insertions, 182 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java index 3485c7ae8ecb..15fd4245a819 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java @@ -67,7 +67,6 @@ import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.pip.phone.PipMenuActivityController; import com.android.wm.shell.pip.phone.PipMotionHelper; import com.android.wm.shell.pip.phone.PipUpdateThread; -import com.android.wm.shell.pip.phone.PipUtils; import com.android.wm.shell.splitscreen.SplitScreen; import java.io.PrintWriter; @@ -281,13 +280,8 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new; mSplitScreenOptional = splitScreenOptional; mTaskOrganizer = shellTaskOrganizer; - - if (!PipUtils.hasSystemFeature(context)) { - Log.w(TAG, "Device not support PIP feature"); - } else { - mTaskOrganizer.addListener(this, TASK_LISTENER_TYPE_PIP); - displayController.addDisplayWindowListener(this); - } + mTaskOrganizer.addListener(this, TASK_LISTENER_TYPE_PIP); + displayController.addDisplayWindowListener(this); } public Handler getUpdateHandler() { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index d191c980375c..13f5ac3edc60 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -17,11 +17,10 @@ package com.android.wm.shell.pip.phone; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; +import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; import static com.android.wm.shell.pip.PipAnimationController.isOutPipDirection; -import android.annotation.NonNull; -import android.annotation.Nullable; import android.app.ActivityManager; import android.app.PictureInPictureParams; import android.app.RemoteAction; @@ -34,11 +33,14 @@ import android.os.Handler; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; -import android.util.Log; +import android.util.Slog; import android.view.DisplayInfo; import android.view.IPinnedStackController; import android.window.WindowContainerTransaction; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.common.DisplayChangeController; import com.android.wm.shell.common.DisplayController; @@ -196,7 +198,7 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac } } - public PipController(Context context, + protected PipController(Context context, DisplayController displayController, PipAppOpsListener pipAppOpsListener, PipBoundsHandler pipBoundsHandler, @@ -207,34 +209,13 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac PipTouchHandler pipTouchHandler, WindowManagerShellWrapper windowManagerShellWrapper ) { - mContext = context; - - if (PipUtils.hasSystemFeature(mContext)) { - initController(context, displayController, pipAppOpsListener, pipBoundsHandler, - pipBoundsState, pipMediaController, pipMenuActivityController, pipTaskOrganizer, - pipTouchHandler, windowManagerShellWrapper); - } else { - Log.w(TAG, "Device not support PIP feature"); - } - } - - private void initController(Context context, - DisplayController displayController, - PipAppOpsListener pipAppOpsListener, - PipBoundsHandler pipBoundsHandler, - @NonNull PipBoundsState pipBoundsState, - PipMediaController pipMediaController, - PipMenuActivityController pipMenuActivityController, - PipTaskOrganizer pipTaskOrganizer, - PipTouchHandler pipTouchHandler, - WindowManagerShellWrapper windowManagerShellWrapper) { - // Ensure that we are the primary user's SystemUI. final int processUser = UserManager.get(context).getUserHandle(); if (processUser != UserHandle.USER_SYSTEM) { throw new IllegalStateException("Non-primary Pip component not currently supported."); } + mContext = context; mWindowManagerShellWrapper = windowManagerShellWrapper; mDisplayController = displayController; mPipBoundsHandler = pipBoundsHandler; @@ -258,7 +239,7 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac mWindowManagerShellWrapper.addPinnedStackListener( new PipControllerPinnedStackListener()); } catch (RemoteException e) { - Log.e(TAG, "Failed to register pinned stack listener", e); + Slog.e(TAG, "Failed to register pinned stack listener", e); } } @@ -465,4 +446,24 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac mPipTaskOrganizer.dump(pw, innerPrefix); mPipBoundsState.dump(pw, innerPrefix); } + + /** + * Instantiates {@link PipController}, returns {@code null} if the feature not supported. + */ + @Nullable + public static PipController create(Context context, DisplayController displayController, + PipAppOpsListener pipAppOpsListener, PipBoundsHandler pipBoundsHandler, + PipBoundsState pipBoundsState, PipMediaController pipMediaController, + PipMenuActivityController pipMenuActivityController, + PipTaskOrganizer pipTaskOrganizer, PipTouchHandler pipTouchHandler, + WindowManagerShellWrapper windowManagerShellWrapper) { + if (!context.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) { + Slog.w(TAG, "Device doesn't support Pip feature"); + return null; + } + + return new PipController(context, displayController, pipAppOpsListener, pipBoundsHandler, + pipBoundsState, pipMediaController, pipMenuActivityController, + pipTaskOrganizer, pipTouchHandler, windowManagerShellWrapper); + } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipUtils.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipUtils.java index 6a58ce0d4646..bd2ba32912bc 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipUtils.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipUtils.java @@ -18,7 +18,6 @@ package com.android.wm.shell.pip.phone; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; -import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; import android.app.ActivityTaskManager; import android.app.ActivityTaskManager.RootTaskInfo; @@ -30,7 +29,6 @@ import android.util.Log; import android.util.Pair; public class PipUtils { - private static final String TAG = "PipUtils"; /** @@ -58,14 +56,4 @@ public class PipUtils { } return new Pair<>(null, 0); } - - /** - * The util to check if device has PIP feature - * - * @param context application context - * @return true if device has PIP feature, false otherwise. - */ - public static boolean hasSystemFeature(Context context) { - return context.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE); - } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java index 2b987e98bc7e..a282a48e8494 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipControllerTest.java @@ -18,17 +18,18 @@ package com.android.wm.shell.pip.phone; import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; +import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.never; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.content.Context; import android.content.pm.PackageManager; import android.os.RemoteException; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; -import android.testing.TestableContext; import android.testing.TestableLooper; import com.android.wm.shell.WindowManagerShellWrapper; @@ -37,10 +38,6 @@ import com.android.wm.shell.pip.PipBoundsHandler; import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipTaskOrganizer; import com.android.wm.shell.pip.PipTestCase; -import com.android.wm.shell.pip.phone.PipAppOpsListener; -import com.android.wm.shell.pip.phone.PipController; -import com.android.wm.shell.pip.phone.PipMediaController; -import com.android.wm.shell.pip.phone.PipTouchHandler; import org.junit.Before; import org.junit.Test; @@ -55,49 +52,52 @@ import org.mockito.MockitoAnnotations; @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper public class PipControllerTest extends PipTestCase { - private com.android.wm.shell.pip.phone.PipController mPipController; - private TestableContext mSpiedContext; + private PipController mPipController; - @Mock private DisplayController mMockdDisplayController; - @Mock private PackageManager mPackageManager; - @Mock private com.android.wm.shell.pip.phone.PipMenuActivityController - mMockPipMenuActivityController; + @Mock private DisplayController mMockDisplayController; + @Mock private PipMenuActivityController mMockPipMenuActivityController; @Mock private PipAppOpsListener mMockPipAppOpsListener; @Mock private PipBoundsHandler mMockPipBoundsHandler; @Mock private PipMediaController mMockPipMediaController; @Mock private PipTaskOrganizer mMockPipTaskOrganizer; @Mock private PipTouchHandler mMockPipTouchHandler; @Mock private WindowManagerShellWrapper mMockWindowManagerShellWrapper; - private PipBoundsState mPipBoundsState; + @Mock private PipBoundsState mMockPipBoundsState; @Before public void setUp() throws RemoteException { MockitoAnnotations.initMocks(this); - mPipBoundsState = new PipBoundsState(); - - mSpiedContext = spy(mContext); - - when(mPackageManager.hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)).thenReturn(false); - when(mSpiedContext.getPackageManager()).thenReturn(mPackageManager); - - mPipController = new PipController(mSpiedContext, mMockdDisplayController, - mMockPipAppOpsListener, mMockPipBoundsHandler, mPipBoundsState, + mPipController = new PipController(mContext, mMockDisplayController, + mMockPipAppOpsListener, mMockPipBoundsHandler, mMockPipBoundsState, mMockPipMediaController, mMockPipMenuActivityController, mMockPipTaskOrganizer, mMockPipTouchHandler, mMockWindowManagerShellWrapper); } @Test - public void testNonPipDevice_shouldNotRegisterPipTransitionCallback() { - verify(mMockPipTaskOrganizer, never()).registerPipTransitionCallback(any()); + public void instantiatePipController_registersPipTransitionCallback() { + verify(mMockPipTaskOrganizer).registerPipTransitionCallback(any()); + } + + @Test + public void instantiatePipController_addsDisplayChangingController() { + verify(mMockDisplayController).addDisplayChangingController(any()); } @Test - public void testNonPipDevice_shouldNotAddDisplayChangingController() { - verify(mMockdDisplayController, never()).addDisplayChangingController(any()); + public void instantiatePipController_addsDisplayWindowListener() { + verify(mMockDisplayController).addDisplayWindowListener(any()); } @Test - public void testNonPipDevice_shouldNotAddDisplayWindowListener() { - verify(mMockdDisplayController, never()).addDisplayWindowListener(any()); + public void createPip_notSupported_returnsNull() { + Context spyContext = spy(mContext); + PackageManager mockPackageManager = mock(PackageManager.class); + when(mockPackageManager.hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)).thenReturn(false); + when(spyContext.getPackageManager()).thenReturn(mockPackageManager); + + assertNull(PipController.create(spyContext, mMockDisplayController, + mMockPipAppOpsListener, mMockPipBoundsHandler, mMockPipBoundsState, + mMockPipMediaController, mMockPipMenuActivityController, mMockPipTaskOrganizer, + mMockPipTouchHandler, mMockWindowManagerShellWrapper)); } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTaskOrganizerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTaskOrganizerTest.java index 37b93bcdd051..46ebbf3846df 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTaskOrganizerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipTaskOrganizerTest.java @@ -16,20 +16,13 @@ package com.android.wm.shell.pip.phone; -import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; - import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import android.content.pm.PackageManager; import android.os.RemoteException; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; -import android.testing.TestableContext; import android.testing.TestableLooper; import com.android.wm.shell.ShellTaskOrganizer; @@ -58,39 +51,30 @@ import java.util.Optional; @TestableLooper.RunWithLooper public class PipTaskOrganizerTest extends PipTestCase { private PipTaskOrganizer mSpiedPipTaskOrganizer; - private TestableContext mSpiedContext; @Mock private DisplayController mMockdDisplayController; - @Mock private PackageManager mPackageManager; @Mock private PipBoundsHandler mMockPipBoundsHandler; @Mock private PipSurfaceTransactionHelper mMockPipSurfaceTransactionHelper; @Mock private PipUiEventLogger mMockPipUiEventLogger; @Mock private Optional<SplitScreen> mMockOptionalSplitScreen; @Mock private ShellTaskOrganizer mMockShellTaskOrganizer; - private PipBoundsState mPipBoundsState; + @Mock private PipBoundsState mMockPipBoundsState; @Before public void setUp() throws RemoteException { MockitoAnnotations.initMocks(this); - mPipBoundsState = new PipBoundsState(); - - mSpiedContext = spy(mContext); - - when(mPackageManager.hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)).thenReturn(false); - when(mSpiedContext.getPackageManager()).thenReturn(mPackageManager); - - mSpiedPipTaskOrganizer = spy(new PipTaskOrganizer(mSpiedContext, mPipBoundsState, + mSpiedPipTaskOrganizer = new PipTaskOrganizer(mContext, mMockPipBoundsState, mMockPipBoundsHandler, mMockPipSurfaceTransactionHelper, mMockOptionalSplitScreen, - mMockdDisplayController, mMockPipUiEventLogger, mMockShellTaskOrganizer)); + mMockdDisplayController, mMockPipUiEventLogger, mMockShellTaskOrganizer); } @Test - public void testNonPipDevice_shellTaskOrganizer_shouldNotAddListener() { - verify(mMockShellTaskOrganizer, never()).addListener(any(), anyInt()); + public void instantiatePipTaskOrganizer_addsTaskListener() { + verify(mMockShellTaskOrganizer).addListener(any(), anyInt()); } @Test - public void testNonPipDevice_displayController_shouldNotAddDisplayWindowListener() { - verify(mMockdDisplayController, never()).addDisplayWindowListener(any()); + public void instantiatePipTaskOrganizer_addsDisplayWindowListener() { + verify(mMockdDisplayController).addDisplayWindowListener(any()); } } diff --git a/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMShellModule.java b/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMShellModule.java index 6d31a8d69ebe..3bfe41045b44 100644 --- a/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMShellModule.java +++ b/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMShellModule.java @@ -26,19 +26,24 @@ import com.android.systemui.wm.DisplaySystemBarsController; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayImeController; import com.android.wm.shell.common.TransactionPool; +import com.android.wm.shell.pip.Pip; +import dagger.BindsOptionalOf; import dagger.Module; import dagger.Provides; /** Provides dependencies from {@link com.android.wm.shell} for CarSystemUI. */ @Module(includes = WMShellBaseModule.class) -public class CarWMShellModule { +public abstract class CarWMShellModule { @SysUISingleton @Provides - DisplayImeController provideDisplayImeController(Context context, + static DisplayImeController provideDisplayImeController(Context context, IWindowManager wmService, DisplayController displayController, @Main Handler mainHandler, TransactionPool transactionPool) { return new DisplaySystemBarsController(context, wmService, displayController, mainHandler, transactionPool); } + + @BindsOptionalOf + abstract Pip optionalPip(); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 5279a20a67a7..ddf30ad663dd 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -95,7 +95,6 @@ import com.android.wm.shell.onehanded.OneHanded; import com.android.wm.shell.onehanded.OneHandedEvents; import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.PipAnimationController; -import com.android.wm.shell.pip.phone.PipUtils; import com.android.wm.shell.splitscreen.SplitScreen; import java.io.FileDescriptor; @@ -151,7 +150,6 @@ public class OverviewProxyService extends CurrentUserTracker implements private int mConnectionBackoffAttempts; private boolean mBound; private boolean mIsEnabled; - private boolean mHasPipFeature; private int mCurrentBoundedUserId = -1; private float mNavBarButtonAlpha; private boolean mInputFocusTransferStarted; @@ -377,9 +375,7 @@ public class OverviewProxyService extends CurrentUserTracker implements @Override public void setShelfHeight(boolean visible, int shelfHeight) { - if (!verifyCaller("setShelfHeight") || !mHasPipFeature) { - Log.w(TAG_OPS, - "ByPass setShelfHeight, FEATURE_PICTURE_IN_PICTURE:" + mHasPipFeature); + if (!verifyCaller("setShelfHeight")) { return; } final long token = Binder.clearCallingIdentity(); @@ -405,9 +401,7 @@ public class OverviewProxyService extends CurrentUserTracker implements @Override public void notifySwipeToHomeFinished() { - if (!verifyCaller("notifySwipeToHomeFinished") || !mHasPipFeature) { - Log.w(TAG_OPS, "ByPass notifySwipeToHomeFinished, FEATURE_PICTURE_IN_PICTURE:" - + mHasPipFeature); + if (!verifyCaller("notifySwipeToHomeFinished")) { return; } final long token = Binder.clearCallingIdentity(); @@ -422,9 +416,7 @@ public class OverviewProxyService extends CurrentUserTracker implements @Override public void setPinnedStackAnimationListener(IPinnedStackAnimationListener listener) { - if (!verifyCaller("setPinnedStackAnimationListener") || !mHasPipFeature) { - Log.w(TAG_OPS, "ByPass setPinnedStackAnimationListener, FEATURE_PICTURE_IN_PICTURE:" - + mHasPipFeature); + if (!verifyCaller("setPinnedStackAnimationListener")) { return; } mIPinnedStackAnimationListener = listener; @@ -509,7 +501,7 @@ public class OverviewProxyService extends CurrentUserTracker implements public Rect startSwipePipToHome(ComponentName componentName, ActivityInfo activityInfo, PictureInPictureParams pictureInPictureParams, int launcherRotation, int shelfHeight) { - if (!verifyCaller("startSwipePipToHome") || !mHasPipFeature) { + if (!verifyCaller("startSwipePipToHome")) { return null; } final long binderToken = Binder.clearCallingIdentity(); @@ -525,7 +517,7 @@ public class OverviewProxyService extends CurrentUserTracker implements @Override public void stopSwipePipToHome(ComponentName componentName, Rect destinationBounds) { - if (!verifyCaller("stopSwipePipToHome") || !mHasPipFeature) { + if (!verifyCaller("stopSwipePipToHome")) { return; } final long binderToken = Binder.clearCallingIdentity(); @@ -650,7 +642,6 @@ public class OverviewProxyService extends CurrentUserTracker implements super(broadcastDispatcher); mContext = context; mPipOptional = pipOptional; - mHasPipFeature = PipUtils.hasSystemFeature(mContext); mStatusBarOptionalLazy = statusBarOptionalLazy; mHandler = new Handler(); mNavBarControllerLazy = navBarControllerLazy; diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java index f55445ca1de3..28343ed5d1f6 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java @@ -46,20 +46,24 @@ import dagger.Provides; */ @Module public abstract class TvPipModule { - @SysUISingleton @Provides - static Pip providePipController(Context context, + static Optional<Pip> providePip( + Context context, PipBoundsHandler pipBoundsHandler, PipTaskOrganizer pipTaskOrganizer, WindowManagerShellWrapper windowManagerShellWrapper) { - return new PipController(context, pipBoundsHandler, pipTaskOrganizer, - windowManagerShellWrapper); + return Optional.of( + new PipController( + context, + pipBoundsHandler, + pipTaskOrganizer, + windowManagerShellWrapper)); } @SysUISingleton @Provides - static PipControlsViewController providePipControlsViewContrller( + static PipControlsViewController providePipControlsViewController( PipControlsView pipControlsView, PipController pipController, LayoutInflater layoutInflater, Handler handler) { return new PipControlsViewController(pipControlsView, pipController, layoutInflater, diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/TvWMShellModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/TvWMShellModule.java index 56efffc29d85..7e1a2e830660 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/TvWMShellModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/TvWMShellModule.java @@ -52,6 +52,8 @@ public class TvWMShellModule { transactionPool); } + @SysUISingleton + @Provides static SplitScreen provideSplitScreen(Context context, DisplayController displayController, SystemWindows systemWindows, DisplayImeController displayImeController, @Main Handler handler, diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java index 9281a090fd97..3c4c3fcdf4f4 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -167,9 +167,6 @@ public final class WMShell extends SystemUI @VisibleForTesting void initPip(Pip pip) { - if (!PipUtils.hasSystemFeature(mContext)) { - return; - } mCommandQueue.addCallback(new CommandQueue.Callbacks() { @Override public void showPictureInPictureMenu() { diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java index 09678b5d1772..ac6e5ded3de3 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java @@ -41,7 +41,6 @@ import com.android.wm.shell.common.SystemWindows; import com.android.wm.shell.common.TransactionPool; import com.android.wm.shell.onehanded.OneHanded; import com.android.wm.shell.onehanded.OneHandedController; -import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.PipSurfaceTransactionHelper; import com.android.wm.shell.pip.PipUiEventLogger; import com.android.wm.shell.pip.phone.PipAppOpsListener; @@ -117,7 +116,7 @@ public abstract class WMShellBaseModule { @SysUISingleton @Provides - static PipSurfaceTransactionHelper providesPipSurfaceTransactionHelper(Context context) { + static PipSurfaceTransactionHelper providePipSurfaceTransactionHelper(Context context) { return new PipSurfaceTransactionHelper(context); } @@ -159,9 +158,6 @@ public abstract class WMShellBaseModule { } @BindsOptionalOf - abstract Pip optionalPip(); - - @BindsOptionalOf abstract SplitScreen optionalSplitScreen(); @BindsOptionalOf diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java index 975757a4c259..81cb1f487ed8 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java @@ -68,24 +68,6 @@ public class WMShellModule { @SysUISingleton @Provides - static Pip providePipController(Context context, - DisplayController displayController, - PipAppOpsListener pipAppOpsListener, - PipBoundsHandler pipBoundsHandler, - PipBoundsState pipBoundsState, - PipMediaController pipMediaController, - PipMenuActivityController pipMenuActivityController, - PipTaskOrganizer pipTaskOrganizer, - PipTouchHandler pipTouchHandler, - WindowManagerShellWrapper windowManagerShellWrapper) { - return new PipController(context, displayController, - pipAppOpsListener, pipBoundsHandler, pipBoundsState, pipMediaController, - pipMenuActivityController, pipTaskOrganizer, pipTouchHandler, - windowManagerShellWrapper); - } - - @SysUISingleton - @Provides static SplitScreen provideSplitScreen(Context context, DisplayController displayController, SystemWindows systemWindows, DisplayImeController displayImeController, @Main Handler handler, @@ -97,26 +79,39 @@ public class WMShellModule { @SysUISingleton @Provides + static Optional<Pip> providePip(Context context, DisplayController displayController, + PipAppOpsListener pipAppOpsListener, PipBoundsHandler pipBoundsHandler, + PipBoundsState pipBoundsState, PipMediaController pipMediaController, + PipMenuActivityController pipMenuActivityController, PipTaskOrganizer pipTaskOrganizer, + PipTouchHandler pipTouchHandler, WindowManagerShellWrapper windowManagerShellWrapper) { + return Optional.ofNullable(PipController.create(context, displayController, + pipAppOpsListener, pipBoundsHandler, pipBoundsState, pipMediaController, + pipMenuActivityController, pipTaskOrganizer, pipTouchHandler, + windowManagerShellWrapper)); + } + + @SysUISingleton + @Provides static PipBoundsState providePipBoundsState() { return new PipBoundsState(); } @SysUISingleton @Provides - static PipBoundsHandler providesPipBoundsHandler(Context context) { + static PipBoundsHandler providePipBoundsHandler(Context context) { return new PipBoundsHandler(context); } @SysUISingleton @Provides - static PipMenuActivityController providesPipMenuActivityController(Context context, + static PipMenuActivityController providePipMenuActivityController(Context context, PipMediaController pipMediaController, PipTaskOrganizer pipTaskOrganizer) { return new PipMenuActivityController(context, pipMediaController, pipTaskOrganizer); } @SysUISingleton @Provides - static PipTouchHandler providesPipTouchHandler(Context context, + static PipTouchHandler providePipTouchHandler(Context context, PipMenuActivityController menuActivityController, PipBoundsHandler pipBoundsHandler, PipBoundsState pipBoundsState, PipTaskOrganizer pipTaskOrganizer, @@ -128,7 +123,7 @@ public class WMShellModule { @SysUISingleton @Provides - static PipTaskOrganizer providesPipTaskOrganizer(Context context, + static PipTaskOrganizer providePipTaskOrganizer(Context context, PipBoundsState pipBoundsState, PipBoundsHandler pipBoundsHandler, PipSurfaceTransactionHelper pipSurfaceTransactionHelper, diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java index 2bc07ed43e29..a58f1fdeb3f3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/WMShellTest.java @@ -16,17 +16,12 @@ package com.android.systemui.wmshell; -import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; - import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.pm.PackageManager; import android.test.suitebuilder.annotation.SmallTest; -import android.testing.TestableContext; import androidx.test.runner.AndroidJUnit4; @@ -94,7 +89,6 @@ public class WMShellTest extends SysuiTestCase { mTaskOrganizer, mProtoTracer); when(mPip.getPipTouchHandler()).thenReturn(mPipTouchHandler); - } @Test @@ -112,26 +106,6 @@ public class WMShellTest extends SysuiTestCase { } @Test - public void nonPipDevice_shouldNotInitPip() { - final TestableContext nonPipContext = getNonPipFeatureContext(); - final WMShell nonPipWMShell = new WMShell(nonPipContext, mCommandQueue, - mConfigurationController, mMockInputConsumerController, mKeyguardUpdateMonitor, - mTaskStackChangeListeners, mDisplayImeController, mNavigationModeController, - mScreenLifecycle, mSysUiState, Optional.of(mPip), Optional.of(mSplitScreen), - Optional.of(mOneHanded), mTaskOrganizer, mProtoTracer); - nonPipWMShell.initPip(mPip); - - verify(mCommandQueue, never()).addCallback(any()); - verify(mKeyguardUpdateMonitor, never()).registerCallback(any()); - verify(mConfigurationController, never()).addCallback(any()); - verify(mSysUiState, never()).addCallback(any()); - verify(mTaskStackChangeListeners, never()).registerTaskStackListener(any()); - verify(mMockInputConsumerController, never()).setInputListener(any()); - verify(mMockInputConsumerController, never()).setRegistrationListener(any()); - verify(mPip, never()).registerSessionListenerForCurrentUser(); - } - - @Test public void initSplitScreen_registersCallbacks() { mWMShell.initSplitScreen(mSplitScreen); @@ -156,11 +130,4 @@ public class WMShellTest extends SysuiTestCase { OneHandedGestureHandler.OneHandedGestureEventCallback.class)); verify(mOneHanded).registerTransitionCallback(any(OneHandedTransitionCallback.class)); } - - TestableContext getNonPipFeatureContext() { - TestableContext spiedContext = spy(mContext); - when(mMockPackageManager.hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)).thenReturn(false); - when(spiedContext.getPackageManager()).thenReturn(mMockPackageManager); - return spiedContext; - } } |