Merge "Respect feature flag when providing Pip controller"
This commit is contained in:
committed by
Android (Google) Code Review
commit
1869ff1f1e
@@ -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