summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Winson Chung <winsonc@google.com> 2020-05-27 21:36:09 -0700
committer Winson Chung <winsonc@google.com> 2020-05-28 04:58:17 +0000
commitc46cbae3a63c55598fa41f6e7a93f269284ee62c (patch)
tree14f9f297e3ef80cd41539dea73660ed148bf9663
parentd34b4e8d278386b85a00018c502bd21d00f8813b (diff)
Disallow multiple calls to dismiss/exit pip
- When exitPip or removePip is called we don't set mInPip=false until the actual changes are commited (either animation is started or task actually vanishes) so if there are multiple subsequent calls, it could fall into the same code twice (haven't actually been able to reproduce the bug but this is one case it could happen) Change-Id: Ica2836827114fdd5affb983ab4444e9eb0c00283 Bug: 157532238 Test: Not actually able to repro
-rw-r--r--packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java13
1 files changed, 9 insertions, 4 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
index c2f8cb9800d0..3a8476729645 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java
@@ -204,6 +204,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements
private WindowContainerToken mToken;
private SurfaceControl mLeash;
private boolean mInPip;
+ private boolean mExitingPip;
private @PipAnimationController.AnimationType int mOneShotAnimationType = ANIM_TYPE_BOUNDS;
private PipSurfaceTransactionHelper.SurfaceControlTransactionFactory
mSurfaceControlTransactionFactory;
@@ -270,9 +271,9 @@ public class PipTaskOrganizer extends TaskOrganizer implements
* @param animationDurationMs duration in millisecond for the exiting PiP transition
*/
public void exitPip(int animationDurationMs) {
- if (!mInPip || mToken == null) {
+ if (!mInPip || mExitingPip || mToken == null) {
Log.wtf(TAG, "Not allowed to exitPip in current state"
- + " mInPip=" + mInPip + " mToken=" + mToken);
+ + " mInPip=" + mInPip + " mExitingPip=" + mExitingPip + " mToken=" + mToken);
return;
}
@@ -312,15 +313,16 @@ public class PipTaskOrganizer extends TaskOrganizer implements
}
});
}
+ mExitingPip = true;
}
/**
* Removes PiP immediately.
*/
public void removePip() {
- if (!mInPip || mToken == null) {
+ if (!mInPip || mExitingPip || mToken == null) {
Log.wtf(TAG, "Not allowed to removePip in current state"
- + " mInPip=" + mInPip + " mToken=" + mToken);
+ + " mInPip=" + mInPip + " mExitingPip=" + mExitingPip + " mToken=" + mToken);
return;
}
getUpdateHandler().post(() -> {
@@ -332,6 +334,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements
}
});
mInitialState.remove(mToken.asBinder());
+ mExitingPip = true;
}
@Override
@@ -340,6 +343,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements
mTaskInfo = info;
mToken = mTaskInfo.token;
mInPip = true;
+ mExitingPip = false;
mLeash = leash;
mInitialState.put(mToken.asBinder(), new Configuration(mTaskInfo.configuration));
mPictureInPictureParams = mTaskInfo.pictureInPictureParams;
@@ -420,6 +424,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements
mShouldDeferEnteringPip = false;
mPictureInPictureParams = null;
mInPip = false;
+ mExitingPip = false;
}
@Override