Add null checks for mRecentsView

Fixed a NPE and added some null checks for mRecentsView. These NPEs can happen if the launcher is destroyed unexpectedly.

Flag: not needed
Fixes: 279738827
Test: ran launcher and tested some gestures
Change-Id: I9c32e22a13d950346ce705ba3a6f11dd3f1da87f
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index b7a29e0..5333cbe 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -177,7 +177,7 @@
     protected @Nullable RecentsAnimationController mDeferredCleanupRecentsAnimationController;
     protected RecentsAnimationTargets mRecentsAnimationTargets;
     protected T mActivity;
-    protected Q mRecentsView;
+    protected @Nullable Q mRecentsView;
     protected Runnable mGestureEndCallback;
     protected MultiStateCallback mStateCallback;
     protected boolean mCanceled;
@@ -1895,7 +1895,9 @@
     private void invalidateHandlerWithLauncher() {
         endLauncherTransitionController();
 
-        mRecentsView.onGestureAnimationEnd();
+        if (mRecentsView != null) {
+            mRecentsView.onGestureAnimationEnd();
+        }
         resetLauncherListeners();
     }
 
@@ -1922,7 +1924,9 @@
     private void resetLauncherListeners() {
         mActivity.getRootView().setOnApplyWindowInsetsListener(null);
 
-        mRecentsView.removeOnScrollChangedListener(mOnRecentsScrollListener);
+        if (mRecentsView != null) {
+            mRecentsView.removeOnScrollChangedListener(mOnRecentsScrollListener);
+        }
     }
 
     private void resetStateForAnimationCancel() {
@@ -1981,8 +1985,10 @@
     private boolean updateThumbnail(int runningTaskId, boolean refreshView) {
         boolean finishTransitionPosted = false;
         final TaskView taskView;
-        if (mGestureState.getEndTarget() == HOME || mGestureState.getEndTarget() == NEW_TASK
-                || mGestureState.getEndTarget() == ALL_APPS) {
+        if (mGestureState.getEndTarget() == HOME
+                || mGestureState.getEndTarget() == NEW_TASK
+                || mGestureState.getEndTarget() == ALL_APPS
+                || mRecentsView == null) {
             // Capture the screenshot before finishing the transition to home or quickswitching to
             // ensure it's taken in the correct orientation, but no need to update the thumbnail.
             taskView = null;
@@ -2135,7 +2141,7 @@
     protected void startNewTask(Consumer<Boolean> resultCallback) {
         // Launch the task user scrolled to (mRecentsView.getNextPage()).
         if (!mCanceled) {
-            TaskView nextTask = mRecentsView.getNextPageTaskView();
+            TaskView nextTask = mRecentsView == null ? null : mRecentsView.getNextPageTaskView();
             if (nextTask != null) {
                 Task.TaskKey nextTaskKey = nextTask.getTask().key;
                 int taskId = nextTaskKey.id;
@@ -2237,7 +2243,8 @@
                     return;
                 }
                 RemoteAnimationTarget taskTarget = taskTargetOptional.get();
-                TaskView taskView = mRecentsView.getTaskViewByTaskId(taskTarget.taskId);
+                TaskView taskView = mRecentsView == null
+                        ? null : mRecentsView.getTaskViewByTaskId(taskTarget.taskId);
                 if (taskView == null || !taskView.getThumbnail().shouldShowSplashView()) {
                     finishRecentsAnimationOnTasksAppeared(null /* onFinishComplete */);
                     return;
@@ -2296,9 +2303,11 @@
      * resume if we finish the controller.
      */
     protected int getLastAppearedTaskIndex() {
-        return mGestureState.getLastAppearedTaskId() != -1
-                ? mRecentsView.getTaskIndexForId(mGestureState.getLastAppearedTaskId())
-                : mRecentsView.getRunningTaskIndex();
+        return mRecentsView == null
+                ? -1
+                : mGestureState.getLastAppearedTaskId() != -1
+                        ? mRecentsView.getTaskIndexForId(mGestureState.getLastAppearedTaskId())
+                        : mRecentsView.getRunningTaskIndex();
     }
 
     /**