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

Commit ac611a12 authored by Hongwei Wang's avatar Hongwei Wang
Browse files

Ensure isInPictureInPicture result in onPause

We use to set Activity#mIsInPictureInPictureMode to be true when app
requests Activity#enterPictureInPictureMode and therefore when they
receive the onPause callback, Activity#isInPictureInPictureMode can be
true. With the new auto-enter-pip API, this code path is no more
relevant and here we add extra info to PauseActivityItem to set the same
flag when WM puts the Activity into PiP mode due to auto-enter.

Video: http://recall/-/aaaaaabFQoRHlzixHdtY/yXi24xi6TgYGhoqB31Oov
Bug: 239618513
Test: follow the reproduce steps in bug, see video
Test: atest PinnedStackTests
Change-Id: I81ece7d3aad8eb868d95f106f6825612e0741a19
parent 9d16d9da
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -980,7 +980,8 @@ public class Activity extends ContextThemeWrapper
    boolean mEnterAnimationComplete;

    private boolean mIsInMultiWindowMode;
    private boolean mIsInPictureInPictureMode;
    /** @hide */
    boolean mIsInPictureInPictureMode;

    private boolean mShouldDockBigOverlays;

+9 −2
Original line number Diff line number Diff line
@@ -4162,7 +4162,8 @@ public final class ActivityThread extends ClientTransactionHandler
    private void schedulePauseWithUserLeavingHint(ActivityClientRecord r) {
        final ClientTransaction transaction = ClientTransaction.obtain(this.mAppThread, r.token);
        transaction.setLifecycleStateRequest(PauseActivityItem.obtain(r.activity.isFinishing(),
                /* userLeaving */ true, r.activity.mConfigChangeFlags, /* dontReport */ false));
                /* userLeaving */ true, r.activity.mConfigChangeFlags, /* dontReport */ false,
                /* autoEnteringPip */ false));
        executeTransaction(transaction);
    }

@@ -4952,12 +4953,18 @@ public final class ActivityThread extends ClientTransactionHandler

    @Override
    public void handlePauseActivity(ActivityClientRecord r, boolean finished, boolean userLeaving,
            int configChanges, PendingTransactionActions pendingActions, String reason) {
            int configChanges, boolean autoEnteringPip, PendingTransactionActions pendingActions,
            String reason) {
        if (userLeaving) {
            performUserLeavingActivity(r);
        }

        r.activity.mConfigChangeFlags |= configChanges;
        if (autoEnteringPip) {
            // Set mIsInPictureInPictureMode earlier in case of auto-enter-pip, see also
            // {@link Activity#enterPictureInPictureMode(PictureInPictureParams)}.
            r.activity.mIsInPictureInPictureMode = true;
        }
        performPauseActivity(r, finished, reason, pendingActions);

        // Make sure any pending writes are now committed.
+2 −2
Original line number Diff line number Diff line
@@ -97,8 +97,8 @@ public abstract class ClientTransactionHandler {

    /** Pause the activity. */
    public abstract void handlePauseActivity(@NonNull ActivityClientRecord r, boolean finished,
            boolean userLeaving, int configChanges, PendingTransactionActions pendingActions,
            String reason);
            boolean userLeaving, int configChanges, boolean autoEnteringPip,
            PendingTransactionActions pendingActions, String reason);

    /**
     * Resume the activity.
+14 −5
Original line number Diff line number Diff line
@@ -39,13 +39,14 @@ public class PauseActivityItem extends ActivityLifecycleItem {
    private boolean mUserLeaving;
    private int mConfigChanges;
    private boolean mDontReport;
    private boolean mAutoEnteringPip;

    @Override
    public void execute(ClientTransactionHandler client, ActivityClientRecord r,
            PendingTransactionActions pendingActions) {
        Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
        client.handlePauseActivity(r, mFinished, mUserLeaving, mConfigChanges, pendingActions,
                "PAUSE_ACTIVITY_ITEM");
        client.handlePauseActivity(r, mFinished, mUserLeaving, mConfigChanges, mAutoEnteringPip,
                pendingActions, "PAUSE_ACTIVITY_ITEM");
        Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
    }

@@ -71,7 +72,7 @@ public class PauseActivityItem extends ActivityLifecycleItem {

    /** Obtain an instance initialized with provided params. */
    public static PauseActivityItem obtain(boolean finished, boolean userLeaving, int configChanges,
            boolean dontReport) {
            boolean dontReport, boolean autoEnteringPip) {
        PauseActivityItem instance = ObjectPool.obtain(PauseActivityItem.class);
        if (instance == null) {
            instance = new PauseActivityItem();
@@ -80,6 +81,7 @@ public class PauseActivityItem extends ActivityLifecycleItem {
        instance.mUserLeaving = userLeaving;
        instance.mConfigChanges = configChanges;
        instance.mDontReport = dontReport;
        instance.mAutoEnteringPip = autoEnteringPip;

        return instance;
    }
@@ -94,6 +96,7 @@ public class PauseActivityItem extends ActivityLifecycleItem {
        instance.mUserLeaving = false;
        instance.mConfigChanges = 0;
        instance.mDontReport = true;
        instance.mAutoEnteringPip = false;

        return instance;
    }
@@ -105,6 +108,7 @@ public class PauseActivityItem extends ActivityLifecycleItem {
        mUserLeaving = false;
        mConfigChanges = 0;
        mDontReport = false;
        mAutoEnteringPip = false;
        ObjectPool.recycle(this);
    }

@@ -117,6 +121,7 @@ public class PauseActivityItem extends ActivityLifecycleItem {
        dest.writeBoolean(mUserLeaving);
        dest.writeInt(mConfigChanges);
        dest.writeBoolean(mDontReport);
        dest.writeBoolean(mAutoEnteringPip);
    }

    /** Read from Parcel. */
@@ -125,6 +130,7 @@ public class PauseActivityItem extends ActivityLifecycleItem {
        mUserLeaving = in.readBoolean();
        mConfigChanges = in.readInt();
        mDontReport = in.readBoolean();
        mAutoEnteringPip = in.readBoolean();
    }

    public static final @NonNull Creator<PauseActivityItem> CREATOR =
@@ -148,7 +154,8 @@ public class PauseActivityItem extends ActivityLifecycleItem {
        }
        final PauseActivityItem other = (PauseActivityItem) o;
        return mFinished == other.mFinished && mUserLeaving == other.mUserLeaving
                && mConfigChanges == other.mConfigChanges && mDontReport == other.mDontReport;
                && mConfigChanges == other.mConfigChanges && mDontReport == other.mDontReport
                && mAutoEnteringPip == other.mAutoEnteringPip;
    }

    @Override
@@ -158,12 +165,14 @@ public class PauseActivityItem extends ActivityLifecycleItem {
        result = 31 * result + (mUserLeaving ? 1 : 0);
        result = 31 * result + mConfigChanges;
        result = 31 * result + (mDontReport ? 1 : 0);
        result = 31 * result + (mAutoEnteringPip ? 1 : 0);
        return result;
    }

    @Override
    public String toString() {
        return "PauseActivityItem{finished=" + mFinished + ",userLeaving=" + mUserLeaving
                + ",configChanges=" + mConfigChanges + ",dontReport=" + mDontReport + "}";
                + ",configChanges=" + mConfigChanges + ",dontReport=" + mDontReport
                + ",autoEnteringPip=" + mAutoEnteringPip + "}";
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -227,7 +227,8 @@ public class TransactionExecutor {
                    break;
                case ON_PAUSE:
                    mTransactionHandler.handlePauseActivity(r, false /* finished */,
                            false /* userLeaving */, 0 /* configChanges */, mPendingActions,
                            false /* userLeaving */, 0 /* configChanges */,
                            false /* autoEnteringPip */, mPendingActions,
                            "LIFECYCLER_PAUSE_ACTIVITY");
                    break;
                case ON_STOP:
Loading