diff options
9 files changed, 55 insertions, 25 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipAppOpsListener.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipAppOpsListener.kt index 193c593e2ab2..2c4df0c0ca49 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipAppOpsListener.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipAppOpsListener.kt @@ -25,7 +25,6 @@ import com.android.wm.shell.common.ShellExecutor class PipAppOpsListener( private val mContext: Context, - private val mCallback: Callback, private val mMainExecutor: ShellExecutor ) { private val mAppOpsManager: AppOpsManager = checkNotNull( @@ -46,7 +45,9 @@ class PipAppOpsListener( packageName ) != AppOpsManager.MODE_ALLOWED ) { - mMainExecutor.execute { mCallback.dismissPip() } + mCallback?.let { + mMainExecutor.execute { it.dismissPip() } + } } } catch (e: PackageManager.NameNotFoundException) { // Unregister the listener if the package can't be found @@ -54,6 +55,12 @@ class PipAppOpsListener( } } + private var mCallback: Callback? = null + + fun setCallback(callback: Callback) { + mCallback = callback + } + fun onActivityPinned(packageName: String) { // Register for changes to the app ops setting for this package while it is in PiP registerAppOpsListener(packageName) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java index de86b22e0a99..6c805c87c08f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java @@ -64,6 +64,7 @@ import com.android.wm.shell.common.TabletopModeController; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.pip.PhonePipKeepClearAlgorithm; import com.android.wm.shell.common.pip.PhoneSizeSpecSource; +import com.android.wm.shell.common.pip.PipAppOpsListener; import com.android.wm.shell.common.pip.PipBoundsAlgorithm; import com.android.wm.shell.common.pip.PipBoundsState; import com.android.wm.shell.common.pip.PipDisplayLayoutState; @@ -531,6 +532,13 @@ public abstract class WMShellBaseModule { pipKeepClearAlgorithm, pipDisplayLayoutState, sizeSpecSource); } + @WMSingleton + @Provides + static PipAppOpsListener providePipAppOpsListener(Context context, + @ShellMainThread ShellExecutor mainExecutor) { + return new PipAppOpsListener(context, mainExecutor); + } + // // Bubbles (optional feature) // diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip1Module.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip1Module.java index cfdfe3d52011..64b6c0f8e75d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip1Module.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip1Module.java @@ -203,14 +203,6 @@ public abstract class Pip1Module { @WMSingleton @Provides - static PipAppOpsListener providePipAppOpsListener(Context context, - PipTouchHandler pipTouchHandler, - @ShellMainThread ShellExecutor mainExecutor) { - return new PipAppOpsListener(context, pipTouchHandler.getMotionHelper(), mainExecutor); - } - - @WMSingleton - @Provides static PipMotionHelper providePipMotionHelper(Context context, @ShellMainThread ShellExecutor mainExecutor, PipBoundsState pipBoundsState, PipTaskOrganizer pipTaskOrganizer, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java index 3a9961917f79..10054a1727fc 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java @@ -28,6 +28,7 @@ import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SystemWindows; import com.android.wm.shell.common.TaskStackListenerImpl; +import com.android.wm.shell.common.pip.PipAppOpsListener; import com.android.wm.shell.common.pip.PipBoundsAlgorithm; import com.android.wm.shell.common.pip.PipBoundsState; import com.android.wm.shell.common.pip.PipDisplayLayoutState; @@ -113,6 +114,7 @@ public abstract class Pip2Module { ShellTaskOrganizer shellTaskOrganizer, PipTransitionState pipTransitionState, PipTouchHandler pipTouchHandler, + PipAppOpsListener pipAppOpsListener, @ShellMainThread ShellExecutor mainExecutor) { if (!PipUtils.isPip2ExperimentEnabled()) { return Optional.empty(); @@ -121,7 +123,7 @@ public abstract class Pip2Module { context, shellInit, shellCommandHandler, shellController, displayController, displayInsetsController, pipBoundsState, pipBoundsAlgorithm, pipDisplayLayoutState, pipScheduler, taskStackListener, shellTaskOrganizer, - pipTransitionState, pipTouchHandler, mainExecutor)); + pipTransitionState, pipTouchHandler, pipAppOpsListener, mainExecutor)); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/TvPipModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/TvPipModule.java index 78e676f8cd45..b9f548297189 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/TvPipModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/TvPipModule.java @@ -233,12 +233,4 @@ public abstract class TvPipModule { static PipParamsChangedForwarder providePipParamsChangedForwarder() { return new PipParamsChangedForwarder(); } - - @WMSingleton - @Provides - static PipAppOpsListener providePipAppOpsListener(Context context, - PipTaskOrganizer pipTaskOrganizer, - @ShellMainThread ShellExecutor mainExecutor) { - return new PipAppOpsListener(context, pipTaskOrganizer::removePip, mainExecutor); - } } 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 582df486b2b3..3cc477602cf0 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 @@ -562,6 +562,8 @@ public class PipController implements PipTransitionController.PipTransitionCallb e.printStackTrace(); } + mAppOpsListener.setCallback(mTouchHandler.getMotionHelper()); + // Handle for system task stack changes. mTaskStackListener.addListener( new TaskStackListenerCallback() { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java index 8ac7f89d8f8a..56a158b0c1c2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java @@ -269,6 +269,8 @@ public class TvPipController implements PipTransitionController.PipTransitionCal mShellController.addConfigurationChangeListener(this); mShellController.addUserChangeListener(this); + + mAppOpsListener.setCallback(mPipTaskOrganizer::removePip); } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java index e309da10864d..a849b9de59ce 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java @@ -23,6 +23,7 @@ import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; import android.annotation.NonNull; import android.app.ActivityManager; import android.app.PictureInPictureParams; +import android.app.TaskInfo; import android.content.ComponentName; import android.content.Context; import android.content.pm.ActivityInfo; @@ -54,6 +55,7 @@ import com.android.wm.shell.common.TaskStackListenerCallback; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.pip.IPip; import com.android.wm.shell.common.pip.IPipAnimationListener; +import com.android.wm.shell.common.pip.PipAppOpsListener; import com.android.wm.shell.common.pip.PipBoundsAlgorithm; import com.android.wm.shell.common.pip.PipBoundsState; import com.android.wm.shell.common.pip.PipDisplayLayoutState; @@ -94,6 +96,7 @@ public class PipController implements ConfigurationChangeListener, private final ShellTaskOrganizer mShellTaskOrganizer; private final PipTransitionState mPipTransitionState; private final PipTouchHandler mPipTouchHandler; + private final PipAppOpsListener mPipAppOpsListener; private final ShellExecutor mMainExecutor; private final PipImpl mImpl; private final List<Consumer<Boolean>> mOnIsInPipStateChangedListeners = new ArrayList<>(); @@ -137,6 +140,7 @@ public class PipController implements ConfigurationChangeListener, ShellTaskOrganizer shellTaskOrganizer, PipTransitionState pipTransitionState, PipTouchHandler pipTouchHandler, + PipAppOpsListener pipAppOpsListener, ShellExecutor mainExecutor) { mContext = context; mShellCommandHandler = shellCommandHandler; @@ -152,6 +156,7 @@ public class PipController implements ConfigurationChangeListener, mPipTransitionState = pipTransitionState; mPipTransitionState.addPipTransitionStateChangedListener(this); mPipTouchHandler = pipTouchHandler; + mPipAppOpsListener = pipAppOpsListener; mMainExecutor = mainExecutor; mImpl = new PipImpl(); @@ -177,6 +182,7 @@ public class PipController implements ConfigurationChangeListener, ShellTaskOrganizer shellTaskOrganizer, PipTransitionState pipTransitionState, PipTouchHandler pipTouchHandler, + PipAppOpsListener pipAppOpsListener, ShellExecutor mainExecutor) { if (!context.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) { ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, @@ -186,7 +192,7 @@ public class PipController implements ConfigurationChangeListener, return new PipController(context, shellInit, shellCommandHandler, shellController, displayController, displayInsetsController, pipBoundsState, pipBoundsAlgorithm, pipDisplayLayoutState, pipScheduler, taskStackListener, shellTaskOrganizer, - pipTransitionState, pipTouchHandler, mainExecutor); + pipTransitionState, pipTouchHandler, pipAppOpsListener, mainExecutor); } public PipImpl getPipImpl() { @@ -225,6 +231,20 @@ public class PipController implements ConfigurationChangeListener, mPipScheduler.scheduleExitPipViaExpand(); } }); + + mPipAppOpsListener.setCallback(mPipTouchHandler.getMotionHelper()); + mPipTransitionState.addPipTransitionStateChangedListener( + (oldState, newState, extra) -> { + if (newState == PipTransitionState.ENTERED_PIP) { + final TaskInfo taskInfo = mPipTransitionState.getPipTaskInfo(); + if (taskInfo != null && taskInfo.topActivity != null) { + mPipAppOpsListener.onActivityPinned( + taskInfo.topActivity.getPackageName()); + } + } else if (newState == PipTransitionState.EXITED_PIP) { + mPipAppOpsListener.onActivityUnpinned(); + } + }); } private ExternalInterfaceBinder createExternalInterface() { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/pip/PipAppOpsListenerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/pip/PipAppOpsListenerTest.java index b9490b881d08..e92e243172f7 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/pip/PipAppOpsListenerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/pip/PipAppOpsListenerTest.java @@ -78,7 +78,8 @@ public class PipAppOpsListenerTest { @Test public void onActivityPinned_registerAppOpsListener() { String packageName = "com.android.test.pip"; - mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockCallback, mMockExecutor); + mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockExecutor); + mPipAppOpsListener.setCallback(mMockCallback); mPipAppOpsListener.onActivityPinned(packageName); @@ -89,7 +90,8 @@ public class PipAppOpsListenerTest { @Test public void onActivityUnpinned_unregisterAppOpsListener() { - mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockCallback, mMockExecutor); + mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockExecutor); + mPipAppOpsListener.setCallback(mMockCallback); mPipAppOpsListener.onActivityUnpinned(); @@ -99,7 +101,8 @@ public class PipAppOpsListenerTest { @Test public void disablePipAppOps_dismissPip() throws PackageManager.NameNotFoundException { String packageName = "com.android.test.pip"; - mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockCallback, mMockExecutor); + mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockExecutor); + mPipAppOpsListener.setCallback(mMockCallback); // Set up the top pip activity info as mTopPipActivity mTopPipActivity = new Pair<>(new ComponentName(packageName, "PipActivity"), 0); mPipAppOpsListener.setTopPipActivityInfoSupplier(this::getTopPipActivity); @@ -131,7 +134,8 @@ public class PipAppOpsListenerTest { public void disablePipAppOps_differentPackage_doNothing() throws PackageManager.NameNotFoundException { String packageName = "com.android.test.pip"; - mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockCallback, mMockExecutor); + mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockExecutor); + mPipAppOpsListener.setCallback(mMockCallback); // Set up the top pip activity info as mTopPipActivity mTopPipActivity = new Pair<>(new ComponentName(packageName, "PipActivity"), 0); mPipAppOpsListener.setTopPipActivityInfoSupplier(this::getTopPipActivity); @@ -160,7 +164,8 @@ public class PipAppOpsListenerTest { public void disablePipAppOps_nameNotFound_unregisterAppOpsListener() throws PackageManager.NameNotFoundException { String packageName = "com.android.test.pip"; - mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockCallback, mMockExecutor); + mPipAppOpsListener = new PipAppOpsListener(mMockContext, mMockExecutor); + mPipAppOpsListener.setCallback(mMockCallback); // Set up the top pip activity info as mTopPipActivity mTopPipActivity = new Pair<>(new ComponentName(packageName, "PipActivity"), 0); mPipAppOpsListener.setTopPipActivityInfoSupplier(this::getTopPipActivity); |