summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipAppOpsListener.kt11
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip1Module.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java4
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/TvPipModule.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java2
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java2
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipController.java22
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/pip/PipAppOpsListenerTest.java15
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);