Mirror task visibility on task org leash

- Depending on the navigation mode, the task is either visible or not
  when entering PIP, and if it is not visible, initially hide the leash
  so that SysUI can control it's visibilty to prevent a flash

Bug: 156941210
Test: Introduce artificial delay on sysui taskAppeared() and verify that
      we don't see the task when entering pip in gesture nav (and that
      it still works in 3 button)

Change-Id: I291afd209af118ac178f8a6421d7df25974315f0
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java
index 83105c2..1da1d11 100644
--- a/services/core/java/com/android/server/wm/TaskOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java
@@ -98,11 +98,14 @@
         final ITaskOrganizer mTaskOrganizer;
         final Consumer<Runnable> mDeferTaskOrgCallbacksConsumer;
 
+        private final SurfaceControl.Transaction mTransaction;
+
         TaskOrganizerCallbacks(WindowManagerService wm, ITaskOrganizer taskOrg,
                 Consumer<Runnable> deferTaskOrgCallbacksConsumer) {
             mService = wm;
             mDeferTaskOrgCallbacksConsumer = deferTaskOrgCallbacksConsumer;
             mTaskOrganizer = taskOrg;
+            mTransaction = wm.mTransactionFactory.get();
         }
 
         IBinder getBinder() {
@@ -110,10 +113,17 @@
         }
 
         void onTaskAppeared(Task task) {
+            final boolean visible = task.isVisible();
             final RunningTaskInfo taskInfo = task.getTaskInfo();
             mDeferTaskOrgCallbacksConsumer.accept(() -> {
                 try {
                     SurfaceControl outSurfaceControl = new SurfaceControl(task.getSurfaceControl());
+                    if (!task.mCreatedByOrganizer && !visible) {
+                        // To prevent flashes, we hide the task prior to sending the leash to the
+                        // task org if the task has previously hidden (ie. when entering PIP)
+                        mTransaction.hide(outSurfaceControl);
+                        mTransaction.apply();
+                    }
                     mTaskOrganizer.onTaskAppeared(taskInfo, outSurfaceControl);
                 } catch (RemoteException e) {
                     Slog.e(TAG, "Exception sending onTaskAppeared callback", e);