diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java index 72c8141c8f2a5..145e52729e110 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/TvPipModule.java @@ -29,6 +29,7 @@ import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.annotations.ShellMainThread; import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.PipAnimationController; +import com.android.wm.shell.pip.PipAppOpsListener; import com.android.wm.shell.pip.PipMediaController; import com.android.wm.shell.pip.PipParamsChangedForwarder; import com.android.wm.shell.pip.PipSnapAlgorithm; @@ -63,6 +64,7 @@ public abstract class TvPipModule { Context context, TvPipBoundsState tvPipBoundsState, TvPipBoundsAlgorithm tvPipBoundsAlgorithm, + PipAppOpsListener pipAppOpsListener, PipTaskOrganizer pipTaskOrganizer, TvPipMenuController tvPipMenuController, PipMediaController pipMediaController, @@ -79,6 +81,7 @@ public abstract class TvPipModule { context, tvPipBoundsState, tvPipBoundsAlgorithm, + pipAppOpsListener, pipTaskOrganizer, pipTransitionController, tvPipMenuController, @@ -185,4 +188,12 @@ 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/dagger/WMShellBaseModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellBaseModule.java index 333567320312a..db6131a17114b 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 @@ -78,7 +78,6 @@ import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.PipMediaController; import com.android.wm.shell.pip.PipSurfaceTransactionHelper; import com.android.wm.shell.pip.PipUiEventLogger; -import com.android.wm.shell.pip.phone.PipAppOpsListener; import com.android.wm.shell.pip.phone.PipTouchHandler; import com.android.wm.shell.recents.RecentTasks; import com.android.wm.shell.recents.RecentTasksController; @@ -435,14 +434,6 @@ public abstract class WMShellBaseModule { return new FloatingContentCoordinator(); } - @WMSingleton - @Provides - static PipAppOpsListener providePipAppOpsListener(Context context, - PipTouchHandler pipTouchHandler, - @ShellMainThread ShellExecutor mainExecutor) { - return new PipAppOpsListener(context, pipTouchHandler.getMotionHelper(), mainExecutor); - } - // Needs handler for registering broadcast receivers @WMSingleton @Provides diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 18a7215610021..1bc9e31b9e2e0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -51,6 +51,7 @@ import com.android.wm.shell.legacysplitscreen.LegacySplitScreenController; import com.android.wm.shell.onehanded.OneHandedController; import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.PipAnimationController; +import com.android.wm.shell.pip.PipAppOpsListener; import com.android.wm.shell.pip.PipBoundsAlgorithm; import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipMediaController; @@ -63,7 +64,6 @@ import com.android.wm.shell.pip.PipTransitionController; import com.android.wm.shell.pip.PipTransitionState; import com.android.wm.shell.pip.PipUiEventLogger; import com.android.wm.shell.pip.phone.PhonePipMenuController; -import com.android.wm.shell.pip.phone.PipAppOpsListener; import com.android.wm.shell.pip.phone.PipController; import com.android.wm.shell.pip.phone.PipMotionHelper; import com.android.wm.shell.pip.phone.PipTouchHandler; @@ -323,6 +323,14 @@ public class WMShellModule { pipSurfaceTransactionHelper, splitScreenOptional); } + @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, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipAppOpsListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAppOpsListener.java similarity index 97% rename from libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipAppOpsListener.java rename to libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAppOpsListener.java index d97d2d6ebb4f7..48a3fc2460a21 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipAppOpsListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipAppOpsListener.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.wm.shell.pip.phone; +package com.android.wm.shell.pip; import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.OP_PICTURE_IN_PICTURE; @@ -28,7 +28,6 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.util.Pair; import com.android.wm.shell.common.ShellExecutor; -import com.android.wm.shell.pip.PipUtils; public class PipAppOpsListener { private static final String TAG = PipAppOpsListener.class.getSimpleName(); 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 7df42e04ea9b6..42ceb42f39e8b 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 @@ -76,6 +76,7 @@ import com.android.wm.shell.pip.IPipAnimationListener; import com.android.wm.shell.pip.PinnedStackListenerForwarder; import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.PipAnimationController; +import com.android.wm.shell.pip.PipAppOpsListener; import com.android.wm.shell.pip.PipBoundsAlgorithm; import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipMediaController; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java index e9b6babfc5fa8..5a21e07342772 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java @@ -44,6 +44,7 @@ import com.android.wm.shell.animation.FloatProperties; import com.android.wm.shell.animation.PhysicsAnimator; import com.android.wm.shell.common.FloatingContentCoordinator; import com.android.wm.shell.common.magnetictarget.MagnetizedObject; +import com.android.wm.shell.pip.PipAppOpsListener; import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipSnapAlgorithm; import com.android.wm.shell.pip.PipTaskOrganizer; 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 8326588bbbad8..fcd1f9583297b 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 @@ -45,6 +45,7 @@ import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.pip.PinnedStackListenerForwarder; import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.PipAnimationController; +import com.android.wm.shell.pip.PipAppOpsListener; import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipMediaController; import com.android.wm.shell.pip.PipParamsChangedForwarder; @@ -97,6 +98,7 @@ public class TvPipController implements PipTransitionController.PipTransitionCal private final TvPipBoundsState mTvPipBoundsState; private final TvPipBoundsAlgorithm mTvPipBoundsAlgorithm; + private final PipAppOpsListener mAppOpsListener; private final PipTaskOrganizer mPipTaskOrganizer; private final PipMediaController mPipMediaController; private final TvPipNotificationController mPipNotificationController; @@ -121,6 +123,7 @@ public class TvPipController implements PipTransitionController.PipTransitionCal Context context, TvPipBoundsState tvPipBoundsState, TvPipBoundsAlgorithm tvPipBoundsAlgorithm, + PipAppOpsListener pipAppOpsListener, PipTaskOrganizer pipTaskOrganizer, PipTransitionController pipTransitionController, TvPipMenuController tvPipMenuController, @@ -136,6 +139,7 @@ public class TvPipController implements PipTransitionController.PipTransitionCal context, tvPipBoundsState, tvPipBoundsAlgorithm, + pipAppOpsListener, pipTaskOrganizer, pipTransitionController, tvPipMenuController, @@ -153,6 +157,7 @@ public class TvPipController implements PipTransitionController.PipTransitionCal Context context, TvPipBoundsState tvPipBoundsState, TvPipBoundsAlgorithm tvPipBoundsAlgorithm, + PipAppOpsListener pipAppOpsListener, PipTaskOrganizer pipTaskOrganizer, PipTransitionController pipTransitionController, TvPipMenuController tvPipMenuController, @@ -181,6 +186,7 @@ public class TvPipController implements PipTransitionController.PipTransitionCal mTvPipMenuController = tvPipMenuController; mTvPipMenuController.setDelegate(this); + mAppOpsListener = pipAppOpsListener; mPipTaskOrganizer = pipTaskOrganizer; pipTransitionController.registerPipTransitionCallback(this); @@ -521,6 +527,12 @@ public class TvPipController implements PipTransitionController.PipTransitionCal @Override public void onActivityPinned(String packageName, int userId, int taskId, int stackId) { checkIfPinnedTaskAppeared(); + mAppOpsListener.onActivityPinned(packageName); + } + + @Override + public void onActivityUnpinned() { + mAppOpsListener.onActivityUnpinned(); } @Override 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 bf0826158c0f4..df18133adcfbe 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 @@ -45,6 +45,7 @@ import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.onehanded.OneHandedController; +import com.android.wm.shell.pip.PipAppOpsListener; import com.android.wm.shell.pip.PipBoundsAlgorithm; import com.android.wm.shell.pip.PipBoundsState; import com.android.wm.shell.pip.PipMediaController; diff --git a/services/midi/java/com/android/server/midi/MidiService.java b/services/midi/java/com/android/server/midi/MidiService.java index 8aa9f60e922d0..994a76700dc0f 100644 --- a/services/midi/java/com/android/server/midi/MidiService.java +++ b/services/midi/java/com/android/server/midi/MidiService.java @@ -238,7 +238,7 @@ public class MidiService extends IMidiManager.Stub { } } - // called from Device.close() + // called from Device.closeLocked() public void removeDeviceConnection(DeviceConnection connection) { mDeviceConnections.remove(connection.getToken()); if (mListeners.size() == 0 && mDeviceConnections.size() == 0) { @@ -294,12 +294,6 @@ public class MidiService extends IMidiManager.Stub { } for (DeviceConnection connection : mDeviceConnections.values()) { - if (connection.getDevice().getDeviceInfo().getType() - == MidiDeviceInfo.TYPE_USB) { - synchronized (mUsbMidiLock) { - removeUsbMidiDeviceLocked(connection.getDevice().getDeviceInfo()); - } - } connection.getDevice().removeDeviceConnection(connection); } } @@ -541,6 +535,13 @@ public class MidiService extends IMidiManager.Stub { synchronized (mDeviceConnections) { mDeviceConnections.remove(connection); + if (connection.getDevice().getDeviceInfo().getType() + == MidiDeviceInfo.TYPE_USB) { + synchronized (mUsbMidiLock) { + removeUsbMidiDeviceLocked(connection.getDevice().getDeviceInfo()); + } + } + if (mDeviceConnections.size() == 0 && mServiceConnection != null) { mContext.unbindService(mServiceConnection); mServiceConnection = null; @@ -559,6 +560,12 @@ public class MidiService extends IMidiManager.Stub { public void closeLocked() { synchronized (mDeviceConnections) { for (DeviceConnection connection : mDeviceConnections) { + if (connection.getDevice().getDeviceInfo().getType() + == MidiDeviceInfo.TYPE_USB) { + synchronized (mUsbMidiLock) { + removeUsbMidiDeviceLocked(connection.getDevice().getDeviceInfo()); + } + } connection.getClient().removeDeviceConnection(connection); } mDeviceConnections.clear(); @@ -1401,6 +1408,8 @@ public class MidiService extends IMidiManager.Stub { String deviceName = extractUsbDeviceName(name); String tagName = extractUsbDeviceTag(name); + Log.i(TAG, "Checking " + deviceName + " " + tagName); + // Only one MIDI 2.0 device can be used at once. // Multiple MIDI 1.0 devices can be used at once. if (mUsbMidiUniversalDeviceInUse.contains(deviceName) @@ -1420,6 +1429,8 @@ public class MidiService extends IMidiManager.Stub { String deviceName = extractUsbDeviceName(name); String tagName = extractUsbDeviceTag(name); + Log.i(TAG, "Adding " + deviceName + " " + tagName); + if ((tagName).equals(MIDI_UNIVERSAL_STRING)) { mUsbMidiUniversalDeviceInUse.add(deviceName); } else if ((tagName).equals(MIDI_LEGACY_STRING)) { @@ -1437,6 +1448,8 @@ public class MidiService extends IMidiManager.Stub { String deviceName = extractUsbDeviceName(name); String tagName = extractUsbDeviceTag(name); + Log.i(TAG, "Removing " + deviceName + " " + tagName); + if ((tagName).equals(MIDI_UNIVERSAL_STRING)) { mUsbMidiUniversalDeviceInUse.remove(deviceName); } else if ((tagName).equals(MIDI_LEGACY_STRING)) {