Defer adding surface changed callback until view root is valid

- It appears there are cases where the view root is not valid (in
  which case schedule() returns false and we don't wait to handle
  the callback) which causes an NPE, but in these cases we don't
  need to add the surface changed callback at all.

Bug: 202776119
Bug: 242347940
Bug: 242897135
Test: Launch an app with sharesheet, swipe up and verify that
      screenshot callbacks

Change-Id: Icc3afc604bd925c5d49c693b7de51755f5a8bd42
diff --git a/quickstep/src/com/android/quickstep/ViewUtils.java b/quickstep/src/com/android/quickstep/ViewUtils.java
index 1bb95b9..b132067 100644
--- a/quickstep/src/com/android/quickstep/ViewUtils.java
+++ b/quickstep/src/com/android/quickstep/ViewUtils.java
@@ -53,13 +53,13 @@
         final Runnable mFinishCallback;
         final BooleanSupplier mCancelled;
         final Handler mHandler;
+        boolean mSurfaceCallbackRegistered = false;
         boolean mFinished;
 
         int mDeferFrameCount = 1;
 
         FrameHandler(View view, Runnable finishCallback, BooleanSupplier cancelled) {
             mViewRoot = view.getViewRootImpl();
-            mViewRoot.addSurfaceChangedCallback(this);
             mFinishCallback = finishCallback;
             mCancelled = cancelled;
             mHandler = new Handler();
@@ -103,6 +103,10 @@
 
         private boolean schedule() {
             if (mViewRoot != null && mViewRoot.getView() != null) {
+                if (!mSurfaceCallbackRegistered) {
+                    mSurfaceCallbackRegistered = true;
+                    mViewRoot.addSurfaceChangedCallback(this);
+                }
                 mViewRoot.registerRtFrameCallback(this);
                 mViewRoot.getView().invalidate();
                 return true;
@@ -119,7 +123,10 @@
             if (mFinishCallback != null) {
                 mFinishCallback.run();
             }
-            mViewRoot.removeSurfaceChangedCallback(this);
+            if (mViewRoot != null) {
+                mViewRoot.removeSurfaceChangedCallback(this);
+                mSurfaceCallbackRegistered = false;
+            }
         }
     }
 }