Test to ensure that pip callbacks are sent if the enter animation is interrupted.

Bug: 63749396
Test: android.server.cts.ActivityManagerPinnedStackTests
Test: #testEnterPipInterruptedCallbacks
Change-Id: If3bb6685064ef2af254d66fb433640586fdc09c3
diff --git a/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerPinnedStackTests.java b/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerPinnedStackTests.java
index 3602391..4916929 100644
--- a/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerPinnedStackTests.java
+++ b/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerPinnedStackTests.java
@@ -19,7 +19,6 @@
 import static android.server.cts.ActivityAndWindowManagersState.DEFAULT_DISPLAY_ID;
 import static android.server.cts.ActivityManagerState.STATE_STOPPED;
 
-import android.server.cts.ActivityManagerState.Activity;
 import android.server.cts.ActivityManagerState.ActivityStack;
 import android.server.cts.ActivityManagerState.ActivityTask;
 
@@ -789,6 +788,38 @@
         assertValidPictureInPictureCallbackOrder(PIP_ACTIVITY, logSeparator);
     }
 
+    public void testEnterPipInterruptedCallbacks() throws Exception {
+        if (!supportsPip()) return;
+
+        // Slow down the transition animations for this test
+        setWindowTransitionAnimationDurationScale(20);
+
+        // Launch a PiP activity
+        launchActivity(PIP_ACTIVITY, EXTRA_ENTER_PIP, "true");
+        // Wait until the PiP activity has moved into the pinned stack (happens before the
+        // transition has started)
+        mAmWmState.waitForValidState(mDevice, PIP_ACTIVITY, PINNED_STACK_ID);
+        assertPinnedStackExists();
+
+        // Relaunch the PiP activity back into fullscreen
+        String logSeparator = clearLogcat();
+        launchActivity(PIP_ACTIVITY);
+        // Wait until the PiP activity is reparented into the fullscreen stack (happens after the
+        // transition has finished)
+        mAmWmState.waitForValidState(mDevice, PIP_ACTIVITY, FULLSCREEN_WORKSPACE_STACK_ID);
+
+        // Ensure that we get the callbacks indicating that PiP/MW mode was cancelled, but no
+        // configuration change (since none was sent)
+        final ActivityLifecycleCounts lifecycleCounts = new ActivityLifecycleCounts(
+                PIP_ACTIVITY, logSeparator);
+        assertTrue(lifecycleCounts.mConfigurationChangedCount == 0);
+        assertTrue(lifecycleCounts.mPictureInPictureModeChangedCount == 1);
+        assertTrue(lifecycleCounts.mMultiWindowModeChangedCount == 1);
+
+        // Reset the animation scale
+        setWindowTransitionAnimationDurationScale(1);
+    }
+
     public void testStopBeforeMultiWindowCallbacksOnDismiss() throws Exception {
         if (!supportsPip()) return;
 
diff --git a/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerTestBase.java b/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerTestBase.java
index 426f4a5..3010e7a 100644
--- a/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerTestBase.java
+++ b/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerTestBase.java
@@ -288,6 +288,7 @@
             setAccelerometerRotation(mInitialAccelerometerRotation);
             setUserRotation(mUserRotation);
             setFontScale(mFontScale);
+            setWindowTransitionAnimationDurationScale(1);
             // Remove special stacks.
             removeStacks(ALL_STACK_IDS_BUT_HOME_AND_FULLSCREEN);
             wakeUpAndUnlockDevice();
@@ -766,6 +767,12 @@
         }
     }
 
+    protected void setWindowTransitionAnimationDurationScale(float animDurationScale)
+            throws DeviceNotAvailableException {
+        runCommandAndPrintOutput(
+                "settings put global transition_animation_scale " + animDurationScale);
+    }
+
     protected float getFontScale() throws DeviceNotAvailableException {
         try {
             final String fontScale =