Fix ImageCapture NPE crash in 1.3.0 alpha

Null check before clearing the states.

Bug: 259109557
Test: manual test and ./gradlew bOS
Change-Id: I5543c8e98c264079cbb46897fcb4c62865c5ddd0
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
index 8d9b4ed..df23742 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
@@ -1659,8 +1659,10 @@
         // RejectedExecutionException if a ProcessingImageReader is used to processing the
         // captured images.
         ExecutorService executorService = mExecutor;
-        imageReaderCloseFuture.addListener(executorService::shutdown,
-                CameraXExecutors.directExecutor());
+        if (executorService != null) {
+            imageReaderCloseFuture.addListener(executorService::shutdown,
+                    CameraXExecutors.directExecutor());
+        }
     }
 
     /**
@@ -1851,7 +1853,9 @@
      *  {@link ImagePipeline}/{@link TakePictureManager}.
      */
 
+    @Nullable
     private ImagePipeline mImagePipeline;
+    @Nullable
     private TakePictureManager mTakePictureManager;
 
     /**
@@ -2055,9 +2059,11 @@
     private void clearPipelineWithNode(boolean keepTakePictureManager) {
         Log.d(TAG, "clearPipelineWithNode");
         checkMainThread();
-        mImagePipeline.close();
-        mImagePipeline = null;
-        if (!keepTakePictureManager) {
+        if (mImagePipeline != null) {
+            mImagePipeline.close();
+            mImagePipeline = null;
+        }
+        if (!keepTakePictureManager && mTakePictureManager != null) {
             mTakePictureManager.abortRequests();
             mTakePictureManager = null;
         }
@@ -2104,7 +2110,7 @@
     @VisibleForTesting
     @NonNull
     TakePictureManager getTakePictureManager() {
-        return mTakePictureManager;
+        return requireNonNull(mTakePictureManager);
     }
 
     // ===== New architecture end =====
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/ImageCaptureTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/ImageCaptureTest.kt
index 7211a30..8bfe101 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/ImageCaptureTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/ImageCaptureTest.kt
@@ -233,6 +233,11 @@
     }
 
     @Test
+    fun detachWithoutAttach_doesNotCrash() {
+        ImageCapture.Builder().build().onDetached()
+    }
+
+    @Test
     fun useImageReaderProvider_pipelineDisabled() {
         assertThat(
             bindImageCapture(