diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java index bdc08718d37f0..da2d38f03caa6 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java @@ -73,7 +73,8 @@ public class PipManager implements BasePipManager { mTouchHandler.onActivityPinned(); mMediaController.onActivityPinned(); mMenuController.onActivityPinned(); - mNotificationController.onActivityPinned(packageName); + mNotificationController.onActivityPinned(packageName, + true /* deferUntilAnimationEnds */); SystemServicesProxy.getInstance(mContext).setPipVisibility(true); } @@ -104,6 +105,7 @@ public class PipManager implements BasePipManager { mTouchHandler.setTouchEnabled(true); mTouchHandler.onPinnedStackAnimationEnded(); mMenuController.onPinnedStackAnimationEnded(); + mNotificationController.onPinnedStackAnimationEnded(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipNotificationController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipNotificationController.java index 53746e2a6124f..696fdbc811e78 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipNotificationController.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipNotificationController.java @@ -60,6 +60,9 @@ public class PipNotificationController { private PipMotionHelper mMotionHelper; + // Used when building a deferred notification + private String mDeferredNotificationPackageName; + private AppOpsManager.OnOpChangedListener mAppOpsChangedListener = new OnOpChangedListener() { @Override public void onOpChanged(String op, String packageName) { @@ -87,10 +90,47 @@ public class PipNotificationController { mMotionHelper = motionHelper; } - public void onActivityPinned(String packageName) { + public void onActivityPinned(String packageName, boolean deferUntilAnimationEnds) { // Clear any existing notification mNotificationManager.cancel(NOTIFICATION_TAG, NOTIFICATION_ID); + if (deferUntilAnimationEnds) { + mDeferredNotificationPackageName = packageName; + } else { + showNotificationForApp(mDeferredNotificationPackageName); + } + + // Register for changes to the app ops setting for this package while it is in PiP + registerAppOpsListener(packageName); + } + + public void onPinnedStackAnimationEnded() { + if (mDeferredNotificationPackageName != null) { + showNotificationForApp(mDeferredNotificationPackageName); + mDeferredNotificationPackageName = null; + } + } + + public void onActivityUnpinned(ComponentName topPipActivity) { + // Unregister for changes to the previously PiP'ed package + unregisterAppOpsListener(); + + // Reset the deferred notification package + mDeferredNotificationPackageName = null; + + if (topPipActivity != null) { + // onActivityUnpinned() is only called after the transition is complete, so we don't + // need to defer until the animation ends to update the notification + onActivityPinned(topPipActivity.getPackageName(), false /* deferUntilAnimationEnds */); + } else { + mNotificationManager.cancel(NOTIFICATION_TAG, NOTIFICATION_ID); + } + } + + /** + * Builds and shows the notification for the given app. + */ + private void showNotificationForApp(String packageName) { // Build a new notification final Notification.Builder builder = new Notification.Builder(mContext, NotificationChannels.GENERAL) @@ -105,20 +145,6 @@ public class PipNotificationController { // Show the new notification mNotificationManager.notify(NOTIFICATION_TAG, NOTIFICATION_ID, builder.build()); } - - // Register for changes to the app ops setting for this package while it is in PiP - registerAppOpsListener(packageName); - } - - public void onActivityUnpinned(ComponentName topPipActivity) { - // Unregister for changes to the previously PiP'ed package - unregisterAppOpsListener(); - - if (topPipActivity != null) { - onActivityPinned(topPipActivity.getPackageName()); - } else { - mNotificationManager.cancel(NOTIFICATION_TAG, NOTIFICATION_ID); - } } /**