Notify SysUI of the recents animation so it can disable autohide

- When swiping up from an immersive sticky app, ensure that we don't
  restore the hidden bar states while swiping up (only update afterwards)

Bug: 130020567
Test: atest CommandQueueTest
Test: Swipe up from an immersive app into launcher while the bars are
      showing

Change-Id: I1c8fb3c0df5c1adc7c73079189f5b45e84d1ef45
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
index 7734d6b..a93d2b8 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
@@ -108,4 +108,9 @@
      * @param displayId display ID
      */
     void onDisplayReady(int displayId);
+
+    /**
+     * Notifies System UI whether the recents animation is running.
+     */
+    void onRecentsAnimationStateChanged(boolean running);
 }
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index b2d7084..112104d 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -453,9 +453,19 @@
             if (mBar != null) {
                 try {
                     mBar.onDisplayReady(displayId);
-                } catch (RemoteException ex) { }
+                } catch (RemoteException ex) {}
             }
         }
+
+        @Override
+        public void onRecentsAnimationStateChanged(boolean running) {
+            if (mBar != null) {
+                try {
+                    mBar.onRecentsAnimationStateChanged(running);
+                } catch (RemoteException ex) {}
+            }
+
+        }
     };
 
     private final GlobalActionsProvider mGlobalActionsProvider = new GlobalActionsProvider() {
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index d2c510f..c03dabe 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -56,6 +56,7 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.server.LocalServices;
 import com.android.server.inputmethod.InputMethodManagerInternal;
+import com.android.server.statusbar.StatusBarManagerInternal;
 import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
 import com.android.server.wm.utils.InsetUtils;
 
@@ -87,6 +88,7 @@
     public @interface ReorderMode {}
 
     private final WindowManagerService mService;
+    private final StatusBarManagerInternal mStatusBar;
     private IRecentsAnimationRunner mRunner;
     private final RecentsAnimationCallbacks mCallbacks;
     private final ArrayList<TaskAnimationAdapter> mPendingAnimations = new ArrayList<>();
@@ -308,6 +310,7 @@
         mRunner = remoteAnimationRunner;
         mCallbacks = callbacks;
         mDisplayId = displayId;
+        mStatusBar = LocalServices.getService(StatusBarManagerInternal.class);
     }
 
     public void initialize(int targetActivityType, SparseBooleanArray recentTaskIds) {
@@ -381,6 +384,9 @@
                 mMinimizedHomeBounds);
 
         mService.mWindowPlacerLocked.performSurfacePlacement();
+
+        // Notify that the animation has started
+        mStatusBar.onRecentsAnimationStateChanged(true /* running */);
     }
 
     @VisibleForTesting
@@ -594,6 +600,9 @@
                         .mAppTransition.notifyAppTransitionFinishedLocked(mTargetAppToken.token);
             }
         }
+
+        // Notify that the animation has ended
+        mStatusBar.onRecentsAnimationStateChanged(false /* running */);
     }
 
     void scheduleFailsafe() {