Respect feature flag when providing Pip controller
Makes sysui dagger provides optional PIP controller with PIP feature flag. Adds test in PipControllerTest to make sure it won't instantiate controller if the feature is not supported. Bug: 170188471 Test: atest SystemUITests Test: atest WMShellUnitTests Change-Id: I681bb5ac2972d6426c270099605d44fc82dc9f78
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 testNonPipDevice_shouldNotAddDisplayChangingController() {
|
||||
verify(mMockdDisplayController, never()).addDisplayChangingController(any());
|
||||
public void instantiatePipController_addsDisplayChangingController() {
|
||||
verify(mMockDisplayController).addDisplayChangingController(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNonPipDevice_shouldNotAddDisplayWindowListener() {
|
||||
verify(mMockdDisplayController, never()).addDisplayWindowListener(any());
|
||||
public void instantiatePipController_addsDisplayWindowListener() {
|
||||
verify(mMockDisplayController).addDisplayWindowListener(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -52,6 +52,8 @@ public class TvWMShellModule {
|
||||
transactionPool);
|
||||
}
|
||||
|
||||
@SysUISingleton
|
||||
@Provides
|
||||
static SplitScreen provideSplitScreen(Context context,
|
||||
DisplayController displayController, SystemWindows systemWindows,
|
||||
DisplayImeController displayImeController, @Main Handler handler,
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -158,9 +157,6 @@ public abstract class WMShellBaseModule {
|
||||
return new FlingAnimationUtils.Builder(displayMetrics);
|
||||
}
|
||||
|
||||
@BindsOptionalOf
|
||||
abstract Pip optionalPip();
|
||||
|
||||
@BindsOptionalOf
|
||||
abstract SplitScreen optionalSplitScreen();
|
||||
|
||||
|
||||
@@ -66,24 +66,6 @@ public class WMShellModule {
|
||||
transactionPool);
|
||||
}
|
||||
|
||||
@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,
|
||||
@@ -95,6 +77,19 @@ public class WMShellModule {
|
||||
displayImeController, handler, transactionPool, shellTaskOrganizer, syncQueue);
|
||||
}
|
||||
|
||||
@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() {
|
||||
@@ -103,20 +98,20 @@ public class WMShellModule {
|
||||
|
||||
@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,
|
||||
|
||||
@@ -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
|
||||
@@ -111,26 +105,6 @@ public class WMShellTest extends SysuiTestCase {
|
||||
verify(mCommandQueue).addCallback(any(CommandQueue.Callbacks.class));
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user