Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6b991b6e authored by Winson Chung's avatar Winson Chung
Browse files

Minor tweak, defer building PiP notification until after transition ends

Bug: 38117789
Test: Enter PIP, ensure the notification is not shown until after transition
Change-Id: Iea4df55a6e9ac86f21fbbf2f967381406920b241
parent ef570066
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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
+41 −15
Original line number Diff line number Diff line
@@ -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,40 +90,63 @@ 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);

        // Build a new notification
        final Notification.Builder builder =
                new Notification.Builder(mContext, NotificationChannels.GENERAL)
                        .setLocalOnly(true)
                        .setOngoing(true)
                        .setSmallIcon(R.drawable.pip_notification_icon)
                        .setColor(mContext.getColor(
                                com.android.internal.R.color.system_notification_accent_color));
        if (updateNotificationForApp(builder, packageName)) {
            SystemUI.overrideNotificationAppName(mContext, builder);

            // Show the new notification
            mNotificationManager.notify(NOTIFICATION_TAG, NOTIFICATION_ID, builder.build());
        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) {
            onActivityPinned(topPipActivity.getPackageName());
            // 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)
                        .setLocalOnly(true)
                        .setOngoing(true)
                        .setSmallIcon(R.drawable.pip_notification_icon)
                        .setColor(mContext.getColor(
                                com.android.internal.R.color.system_notification_accent_color));
        if (updateNotificationForApp(builder, packageName)) {
            SystemUI.overrideNotificationAppName(mContext, builder);

            // Show the new notification
            mNotificationManager.notify(NOTIFICATION_TAG, NOTIFICATION_ID, builder.build());
        }
    }

    /**
     * Updates the notification builder with app-specific information, returning whether it was
     * successful.