Remove ImageCaptureCOnfig.Builder and move it to ImageCapture.Builder.

Bug: 144454947
Test: ./gradlew bOS
Change-Id: Ie71de278f86527ad280c369896c2966649c3727d
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java
index 4b22f84..4bfb4c9 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java
@@ -117,7 +117,7 @@
     private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
 
     private ExecutorService mListenerExecutor;
-    private ImageCaptureConfig mDefaultConfig;
+    private ImageCapture.Builder mDefaultBuilder;
     private FakeRepeatingUseCase mRepeatingUseCase;
     private FakeUseCaseConfig mFakeUseCaseConfig;
     private String mCameraId;
@@ -148,7 +148,7 @@
                 throw new IllegalStateException("Invalid sensor rotation: " + sensorRotation);
         }
 
-        return new ImageCaptureConfig.Builder()
+        return new ImageCapture.Builder()
                 .setTargetRotation(surfaceRotation)
                 .getUseCaseConfig();
     }
@@ -167,7 +167,7 @@
             throw new IllegalArgumentException(
                     "Unable to attach to camera with LensFacing " + BACK_LENS_FACING, e);
         }
-        mDefaultConfig = new ImageCaptureConfig.Builder().getUseCaseConfig();
+        mDefaultBuilder = new ImageCapture.Builder();
 
         mFakeUseCaseConfig = new FakeUseCaseConfig.Builder().getUseCaseConfig();
         mRepeatingUseCase = new FakeRepeatingUseCase(mFakeUseCaseConfig, BACK_SELECTOR);
@@ -188,7 +188,7 @@
 
     @Test
     public void capturedImageHasCorrectSize() {
-        ImageCapture useCase = new ImageCaptureConfig.Builder().setTargetResolution(
+        ImageCapture useCase = new ImageCapture.Builder().setTargetResolution(
                 DEFAULT_RESOLUTION).setTargetRotation(Surface.ROTATION_0).build();
 
         mInstrumentation.runOnMainSync(
@@ -226,7 +226,7 @@
     @FlakyTest //TODO(b/143734846): Callback is not always being called
     @Test
     public void canCaptureMultipleImages() {
-        ImageCapture useCase = new ImageCapture(mDefaultConfig);
+        ImageCapture useCase = mDefaultBuilder.build();
         mInstrumentation.runOnMainSync(
                 () -> {
                     CameraX.bindToLifecycle(mLifecycleOwner, BACK_SELECTOR, useCase);
@@ -247,7 +247,7 @@
     @FlakyTest //TODO(b/143734846): Callback is not always being called
     @Test
     public void canCaptureMultipleImagesWithMaxQuality() {
-        ImageCapture useCase = new ImageCaptureConfig.Builder()
+        ImageCapture useCase = new ImageCapture.Builder()
                 .setCaptureMode(ImageCapture.CaptureMode.MAX_QUALITY)
                 .build();
         mInstrumentation.runOnMainSync(
@@ -268,7 +268,7 @@
 
     @Test
     public void saveCanSucceed() throws IOException {
-        ImageCapture useCase = new ImageCapture(mDefaultConfig);
+        ImageCapture useCase = mDefaultBuilder.build();
         mInstrumentation.runOnMainSync(
                 () -> {
                     CameraX.bindToLifecycle(mLifecycleOwner, BACK_SELECTOR, useCase);
@@ -286,7 +286,7 @@
 
     @Test
     public void canSaveFile_withRotation() throws IOException {
-        ImageCapture useCase = new ImageCaptureConfig.Builder().setTargetRotation(
+        ImageCapture useCase = new ImageCapture.Builder().setTargetRotation(
                 Surface.ROTATION_0).build();
         mInstrumentation.runOnMainSync(
                 () -> {
@@ -316,7 +316,8 @@
             throws IOException, CameraInfoUnavailableException {
         // Use a non-rotated configuration since some combinations of rotation + flipping vertically
         // can be equivalent to flipping horizontally
-        ImageCapture useCase = new ImageCapture(createNonRotatedConfiguration());
+        ImageCapture useCase = ImageCapture.Builder.fromConfig(
+                createNonRotatedConfiguration()).build();
         mInstrumentation.runOnMainSync(
                 () -> {
                     CameraX.bindToLifecycle(mLifecycleOwner, BACK_SELECTOR, useCase);
@@ -343,7 +344,8 @@
             throws IOException, CameraInfoUnavailableException {
         // Use a non-rotated configuration since some combinations of rotation + flipping
         // horizontally can be equivalent to flipping vertically
-        ImageCapture useCase = new ImageCapture(createNonRotatedConfiguration());
+        ImageCapture useCase = ImageCapture.Builder.fromConfig(
+                createNonRotatedConfiguration()).build();
         mInstrumentation.runOnMainSync(
                 () -> {
                     CameraX.bindToLifecycle(mLifecycleOwner, BACK_SELECTOR, useCase);
@@ -367,7 +369,7 @@
 
     @Test
     public void canSaveFile_withAttachedLocation() throws IOException {
-        ImageCapture useCase = new ImageCapture(mDefaultConfig);
+        ImageCapture useCase = mDefaultBuilder.build();
         mInstrumentation.runOnMainSync(
                 () -> {
                     CameraX.bindToLifecycle(mLifecycleOwner, BACK_SELECTOR, useCase);
@@ -392,7 +394,7 @@
 
     @Test
     public void canSaveMultipleFiles() throws IOException {
-        ImageCapture useCase = new ImageCapture(mDefaultConfig);
+        ImageCapture useCase = mDefaultBuilder.build();
         mInstrumentation.runOnMainSync(
                 () -> {
                     CameraX.bindToLifecycle(mLifecycleOwner, BACK_SELECTOR, useCase);
@@ -414,7 +416,7 @@
 
     @Test
     public void saveWillFail_whenInvalidFilePathIsUsed() {
-        ImageCapture useCase = new ImageCapture(mDefaultConfig);
+        ImageCapture useCase = mDefaultBuilder.build();
         mInstrumentation.runOnMainSync(
                 () -> {
                     CameraX.bindToLifecycle(mLifecycleOwner, BACK_SELECTOR, useCase);
@@ -434,11 +436,11 @@
     @Test
     @UseExperimental(markerClass = ExperimentalCamera2Interop.class)
     public void camera2InteropCaptureSessionCallbacks() {
-        ImageCaptureConfig.Builder configBuilder = new ImageCaptureConfig.Builder();
+        ImageCapture.Builder builder = new ImageCapture.Builder();
         CameraCaptureSession.CaptureCallback captureCallback =
                 mock(CameraCaptureSession.CaptureCallback.class);
-        new Camera2Config.Extender(configBuilder).setSessionCaptureCallback(captureCallback);
-        ImageCapture useCase = configBuilder.build();
+        new Camera2Config.Extender(builder).setSessionCaptureCallback(captureCallback);
+        ImageCapture useCase = builder.build();
         mInstrumentation.runOnMainSync(
                 () -> {
                     CameraX.bindToLifecycle(mLifecycleOwner, BACK_SELECTOR, useCase);
@@ -478,7 +480,7 @@
         Assume.assumeTrue(resolutions.length > 0);
         Size resolution = resolutions[0];
 
-        ImageCapture useCase = new ImageCaptureConfig.Builder()
+        ImageCapture useCase = new ImageCapture.Builder()
                 .setBufferFormat(ImageFormat.RAW10)
                 .build();
         mInstrumentation.runOnMainSync(
@@ -498,7 +500,7 @@
 
     @Test(expected = IllegalArgumentException.class)
     public void constructor_withBufferFormatAndCaptureProcessor_throwsException() {
-        new ImageCaptureConfig.Builder()
+        new ImageCapture.Builder()
                 .setBufferFormat(ImageFormat.RAW_SENSOR)
                 .setCaptureProcessor(mock(CaptureProcessor.class))
                 .build();
@@ -506,7 +508,7 @@
 
     @Test(expected = IllegalArgumentException.class)
     public void constructor_maxCaptureStageInvalid_throwsException() {
-        new ImageCaptureConfig.Builder().setMaxCaptureStages(0).build();
+        new ImageCapture.Builder().setMaxCaptureStages(0).build();
     }
 
     @Test
@@ -521,7 +523,7 @@
             }
         };
 
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder().setCaptureBundle(
+        ImageCapture imageCapture = new ImageCapture.Builder().setCaptureBundle(
                 captureBundle).build();
 
         mInstrumentation.runOnMainSync(() -> {
@@ -551,7 +553,7 @@
             }
         };
 
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder()
+        ImageCapture imageCapture = new ImageCapture.Builder()
                 .setMaxCaptureStages(1)
                 .setCaptureBundle(captureBundle)
                 .setCaptureProcessor(mock(CaptureProcessor.class))
@@ -580,7 +582,7 @@
 
     @Test
     public void onCaptureCancelled_onErrorCAMERA_CLOSED() throws InterruptedException {
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder().build();
+        ImageCapture imageCapture = new ImageCapture.Builder().build();
         mInstrumentation.runOnMainSync(() -> {
             CameraX.bindToLifecycle(mLifecycleOwner, BACK_SELECTOR, imageCapture);
             mLifecycleOwner.startAndResume();
@@ -606,7 +608,7 @@
 
     @Test
     public void onRequestFailed_OnErrorCAPTURE_FAILED() throws InterruptedException {
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder().build();
+        ImageCapture imageCapture = new ImageCapture.Builder().build();
         mInstrumentation.runOnMainSync(() -> {
             CameraX.bindToLifecycle(mLifecycleOwner, BACK_SELECTOR, imageCapture);
             mLifecycleOwner.startAndResume();
@@ -635,7 +637,7 @@
 
     @Test
     public void onStateOffline_abortAllCaptureRequests() {
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder().build();
+        ImageCapture imageCapture = new ImageCapture.Builder().build();
         mInstrumentation.runOnMainSync(() -> {
             CameraX.bindToLifecycle(mLifecycleOwner, BACK_SELECTOR, imageCapture);
             mLifecycleOwner.startAndResume();
@@ -664,7 +666,7 @@
 
     @Test
     public void takePictureReturnsErrorNO_CAMERA_whenNotBound() {
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder().build();
+        ImageCapture imageCapture = new ImageCapture.Builder().build();
 
         OnImageCapturedCallback callback = createMockOnImageCapturedCallback(null);
         imageCapture.takePicture(mListenerExecutor, callback);
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/UseCaseCombinationTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/UseCaseCombinationTest.java
index deb6d09..b2bb7ea 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/UseCaseCombinationTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/UseCaseCombinationTest.java
@@ -35,7 +35,6 @@
 import androidx.camera.core.ImageAnalysis;
 import androidx.camera.core.ImageAnalysisConfig;
 import androidx.camera.core.ImageCapture;
-import androidx.camera.core.ImageCaptureConfig;
 import androidx.camera.core.LensFacing;
 import androidx.camera.core.Preview;
 import androidx.camera.core.PreviewSurfaceProviders;
@@ -217,7 +216,7 @@
     }
 
     private void initImageCapture() {
-        mImageCapture = new ImageCaptureConfig.Builder().build();
+        mImageCapture = new ImageCapture.Builder().build();
     }
 
     private void initPreview() {
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2ImplCameraXTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2ImplCameraXTest.java
index 3b0a52d..5ce4ab6 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2ImplCameraXTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/Camera2ImplCameraXTest.java
@@ -49,7 +49,6 @@
 import androidx.camera.core.ImageAnalysis;
 import androidx.camera.core.ImageAnalysisConfig;
 import androidx.camera.core.ImageCapture;
-import androidx.camera.core.ImageCaptureConfig;
 import androidx.camera.core.ImageProxy;
 import androidx.camera.core.LensFacing;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
@@ -428,7 +427,7 @@
         new Camera2Config.Extender(builder).setDeviceStateCallback(mDeviceStateCallback);
         ImageAnalysis useCase0 = builder.build();
 
-        ImageCapture useCase1 = new ImageCaptureConfig.Builder()
+        ImageCapture useCase1 = new ImageCapture.Builder()
                 .setCaptureMode(ImageCapture.CaptureMode.MAX_QUALITY)
                 .build();
 
@@ -460,7 +459,7 @@
         new Camera2Config.Extender(builder).setDeviceStateCallback(mDeviceStateCallback);
         ImageAnalysis useCase0 = builder.build();
 
-        ImageCapture useCase1 = new ImageCaptureConfig.Builder()
+        ImageCapture useCase1 = new ImageCapture.Builder()
                 .setCaptureMode(ImageCapture.CaptureMode.MAX_QUALITY)
                 .build();
 
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/UseCaseSurfaceOccupancyManagerTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/UseCaseSurfaceOccupancyManagerTest.java
index 07362fce..3078636 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/UseCaseSurfaceOccupancyManagerTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/impl/UseCaseSurfaceOccupancyManagerTest.java
@@ -22,7 +22,6 @@
 import androidx.camera.core.AppConfig;
 import androidx.camera.core.CameraX;
 import androidx.camera.core.ImageCapture;
-import androidx.camera.core.ImageCaptureConfig;
 import androidx.camera.core.UseCase;
 import androidx.camera.core.VideoCapture;
 import androidx.camera.core.VideoCaptureConfig;
@@ -57,9 +56,9 @@
 
     @Test(expected = IllegalArgumentException.class)
     public void failedWhenBindTooManyImageCapture() {
-        ImageCaptureConfig config = new ImageCaptureConfig.Builder().getUseCaseConfig();
-        ImageCapture useCase1 = new ImageCapture(config);
-        ImageCapture useCase2 = new ImageCapture(config);
+        ImageCapture.Builder builder = new ImageCapture.Builder();
+        ImageCapture useCase1 = builder.build();
+        ImageCapture useCase2 = builder.build();
 
         // Should throw IllegalArgumentException
         UseCaseSurfaceOccupancyManager.checkUseCaseLimitNotExceeded(
@@ -81,7 +80,7 @@
 
     @Test
     public void passWhenNotBindTooManyImageVideoCapture() {
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder().build();
+        ImageCapture imageCapture = new ImageCapture.Builder().build();
         VideoCapture videoCapture = new VideoCaptureConfig.Builder().build();
 
         UseCaseSurfaceOccupancyManager.checkUseCaseLimitNotExceeded(
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/ImageCaptureConfigProvider.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/ImageCaptureConfigProvider.java
index 99b4677..4bcc187 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/ImageCaptureConfigProvider.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/ImageCaptureConfigProvider.java
@@ -54,9 +54,8 @@
 
     @Override
     public ImageCaptureConfig getConfig(LensFacing lensFacing) {
-        ImageCaptureConfig.Builder builder =
-                ImageCaptureConfig.Builder.fromConfig(
-                        ImageCapture.DEFAULT_CONFIG.getConfig(lensFacing));
+        ImageCapture.Builder builder = ImageCapture.Builder.fromConfig(
+                ImageCapture.DEFAULT_CONFIG.getConfig(lensFacing));
 
         // SessionConfig containing all intrinsic properties needed for ImageCapture
         SessionConfig.Builder sessionBuilder = new SessionConfig.Builder();
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2CaptureOptionUnpackerTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2CaptureOptionUnpackerTest.java
index 29d4c2d..0fd205c 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2CaptureOptionUnpackerTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2CaptureOptionUnpackerTest.java
@@ -29,7 +29,7 @@
 import androidx.camera.camera2.ExperimentalCamera2Interop;
 import androidx.camera.core.CameraCaptureCallback;
 import androidx.camera.core.CaptureConfig;
-import androidx.camera.core.ImageCaptureConfig;
+import androidx.camera.core.ImageCapture;
 import androidx.test.filters.SmallTest;
 
 import org.junit.Before;
@@ -55,14 +55,14 @@
     @Test
     @UseExperimental(markerClass = ExperimentalCamera2Interop.class)
     public void unpackerExtractsCaptureCallbacks() {
-        ImageCaptureConfig.Builder imageCaptureConfigBuilder = new ImageCaptureConfig.Builder();
+        ImageCapture.Builder imageCaptureBuilder = new ImageCapture.Builder();
         CaptureCallback captureCallback = mock(CaptureCallback.class);
 
-        new Camera2Config.Extender(imageCaptureConfigBuilder)
+        new Camera2Config.Extender(imageCaptureBuilder)
                 .setSessionCaptureCallback(captureCallback);
 
         CaptureConfig.Builder captureBuilder = new CaptureConfig.Builder();
-        mUnpacker.unpack(imageCaptureConfigBuilder.getUseCaseConfig(), captureBuilder);
+        mUnpacker.unpack(imageCaptureBuilder.getUseCaseConfig(), captureBuilder);
         CaptureConfig captureConfig = captureBuilder.build();
 
         CameraCaptureCallback cameraCaptureCallback =
@@ -74,7 +74,7 @@
     @Test
     @UseExperimental(markerClass = ExperimentalCamera2Interop.class)
     public void unpackerExtractsOptions() {
-        ImageCaptureConfig.Builder imageCaptureConfigBuilder = new ImageCaptureConfig.Builder();
+        ImageCapture.Builder imageCaptureConfigBuilder = new ImageCapture.Builder();
 
         // Add 2 options to ensure that multiple options can be unpacked.
         new Camera2Config.Extender(imageCaptureConfigBuilder)
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2DeviceSurfaceManagerTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2DeviceSurfaceManagerTest.java
index 55c1978..e1cc587 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2DeviceSurfaceManagerTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2DeviceSurfaceManagerTest.java
@@ -330,7 +330,7 @@
 
     @Test
     public void suggestedResolutionsForMixedUseCaseNotSupportedInLegacyDevice() {
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder()
+        ImageCapture imageCapture = new ImageCapture.Builder()
                 .setTargetAspectRatio(AspectRatio.RATIO_16_9)
                 .build();
         VideoCapture videoCapture = new VideoCaptureConfig.Builder()
@@ -359,7 +359,7 @@
 
     @Test
     public void getSuggestedResolutionsForMixedUseCaseInLimitedDevice() {
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder()
+        ImageCapture imageCapture = new ImageCapture.Builder()
                 .setTargetAspectRatio(AspectRatio.RATIO_16_9)
                 .build();
         VideoCapture videoCapture = new VideoCaptureConfig.Builder()
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java
index d544ea2..90fe766 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/Camera2SessionOptionUnpackerTest.java
@@ -31,7 +31,7 @@
 import androidx.camera.camera2.Camera2Config;
 import androidx.camera.camera2.ExperimentalCamera2Interop;
 import androidx.camera.core.CameraCaptureCallback;
-import androidx.camera.core.ImageCaptureConfig;
+import androidx.camera.core.ImageCapture;
 import androidx.camera.core.SessionConfig;
 import androidx.test.filters.SmallTest;
 
@@ -58,7 +58,7 @@
     @Test
     @UseExperimental(markerClass = ExperimentalCamera2Interop.class)
     public void unpackerExtractsInteropCallbacks() {
-        ImageCaptureConfig.Builder imageCaptureConfigBuilder = new ImageCaptureConfig.Builder();
+        ImageCapture.Builder imageCaptureBuilder = new ImageCapture.Builder();
         CaptureCallback captureCallback = mock(CaptureCallback.class);
         CameraDevice.StateCallback deviceCallback = mock(CameraDevice.StateCallback.class);
         CameraCaptureSession.StateCallback sessionStateCallback =
@@ -66,14 +66,14 @@
         CameraEventCallbacks cameraEventCallbacks = mock(CameraEventCallbacks.class);
         when(cameraEventCallbacks.clone()).thenReturn(cameraEventCallbacks);
 
-        new Camera2Config.Extender(imageCaptureConfigBuilder)
+        new Camera2Config.Extender(imageCaptureBuilder)
                 .setSessionCaptureCallback(captureCallback)
                 .setDeviceStateCallback(deviceCallback)
                 .setSessionStateCallback(sessionStateCallback)
                 .setCameraEventCallback(cameraEventCallbacks);
 
         SessionConfig.Builder sessionBuilder = new SessionConfig.Builder();
-        mUnpacker.unpack(imageCaptureConfigBuilder.getUseCaseConfig(), sessionBuilder);
+        mUnpacker.unpack(imageCaptureBuilder.getUseCaseConfig(), sessionBuilder);
         SessionConfig sessionConfig = sessionBuilder.build();
 
         CameraCaptureCallback interopCallback =
@@ -95,7 +95,7 @@
     @Test
     @UseExperimental(markerClass = ExperimentalCamera2Interop.class)
     public void unpackerExtractsOptions() {
-        ImageCaptureConfig.Builder imageCaptureConfigBuilder = new ImageCaptureConfig.Builder();
+        ImageCapture.Builder imageCaptureConfigBuilder = new ImageCapture.Builder();
 
         // Add 2 options to ensure that multiple options can be unpacked.
         new Camera2Config.Extender(imageCaptureConfigBuilder)
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/ImageCaptureOptionUnpackerTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/ImageCaptureOptionUnpackerTest.java
index a49500a..a735592 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/ImageCaptureOptionUnpackerTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/ImageCaptureOptionUnpackerTest.java
@@ -92,7 +92,7 @@
     @Test
     public void unpackWithoutCaptureMode() {
         CaptureConfig.Builder captureBuilder = new CaptureConfig.Builder();
-        ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder().getUseCaseConfig();
+        ImageCaptureConfig imageCaptureConfig = new ImageCapture.Builder().getUseCaseConfig();
 
         mUnpacker.setDeviceProperty(PROPERTIES_PIXEL_2_API26);
         mUnpacker.unpack(imageCaptureConfig, captureBuilder);
@@ -107,7 +107,7 @@
     @Test
     public void unpackWithValidPixel2AndMinLatency() {
         CaptureConfig.Builder captureBuilder = new CaptureConfig.Builder();
-        ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder()
+        ImageCaptureConfig imageCaptureConfig = new ImageCapture.Builder()
                 .setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY)
                 .getUseCaseConfig();
 
@@ -124,7 +124,7 @@
     @Test
     public void unpackWithValidPixel2AndMaxQuality() {
         CaptureConfig.Builder captureBuilder = new CaptureConfig.Builder();
-        ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder()
+        ImageCaptureConfig imageCaptureConfig = new ImageCapture.Builder()
                 .setCaptureMode(ImageCapture.CaptureMode.MAX_QUALITY)
                 .getUseCaseConfig();
 
@@ -141,7 +141,7 @@
     @Test
     public void unpackWithPixel2NotSupportApiLevelAndMinLatency() {
         CaptureConfig.Builder captureBuilder = new CaptureConfig.Builder();
-        ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder()
+        ImageCaptureConfig imageCaptureConfig = new ImageCapture.Builder()
                 .setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY)
                 .getUseCaseConfig();
 
@@ -158,7 +158,7 @@
     @Test
     public void unpackWithPixel2NotSupportApiLevelAndMaxQuality() {
         CaptureConfig.Builder captureBuilder = new CaptureConfig.Builder();
-        ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder()
+        ImageCaptureConfig imageCaptureConfig = new ImageCapture.Builder()
                 .setCaptureMode(ImageCapture.CaptureMode.MAX_QUALITY)
                 .getUseCaseConfig();
 
@@ -175,7 +175,7 @@
     @Test
     public void unpackWithValidPixel3AndMinLatency() {
         CaptureConfig.Builder captureBuilder = new CaptureConfig.Builder();
-        ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder()
+        ImageCaptureConfig imageCaptureConfig = new ImageCapture.Builder()
                 .setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY)
                 .getUseCaseConfig();
 
@@ -192,7 +192,7 @@
     @Test
     public void unpackWithValidPixel3AndMaxQuality() {
         CaptureConfig.Builder captureBuilder = new CaptureConfig.Builder();
-        ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder()
+        ImageCaptureConfig imageCaptureConfig = new ImageCapture.Builder()
                 .setCaptureMode(ImageCapture.CaptureMode.MAX_QUALITY)
                 .getUseCaseConfig();
 
@@ -209,7 +209,7 @@
     @Test
     public void unpackWithPixel3NotSupportApiLevelAndMinLatency() {
         CaptureConfig.Builder captureBuilder = new CaptureConfig.Builder();
-        ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder()
+        ImageCaptureConfig imageCaptureConfig = new ImageCapture.Builder()
                 .setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY)
                 .getUseCaseConfig();
 
@@ -226,7 +226,7 @@
     @Test
     public void unpackWithPixel3NotSupportApiLevelAndMaxQuality() {
         CaptureConfig.Builder captureBuilder = new CaptureConfig.Builder();
-        ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder()
+        ImageCaptureConfig imageCaptureConfig = new ImageCapture.Builder()
                 .setCaptureMode(ImageCapture.CaptureMode.MAX_QUALITY)
                 .getUseCaseConfig();
 
@@ -243,7 +243,7 @@
     @Test
     public void unpackWithNotSupportManufacture() {
         CaptureConfig.Builder captureBuilder = new CaptureConfig.Builder();
-        ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder()
+        ImageCaptureConfig imageCaptureConfig = new ImageCapture.Builder()
                 .setCaptureMode(ImageCapture.CaptureMode.MAX_QUALITY)
                 .getUseCaseConfig();
 
@@ -260,7 +260,7 @@
     @Test
     public void unpackWithNotSupportModel() {
         CaptureConfig.Builder captureBuilder = new CaptureConfig.Builder();
-        ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder()
+        ImageCaptureConfig imageCaptureConfig = new ImageCapture.Builder()
                 .setCaptureMode(ImageCapture.CaptureMode.MAX_QUALITY)
                 .getUseCaseConfig();
 
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/SupportedSurfaceCombinationTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/SupportedSurfaceCombinationTest.java
index 1682758..7cefb48 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/SupportedSurfaceCombinationTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/impl/SupportedSurfaceCombinationTest.java
@@ -526,7 +526,7 @@
                         mContext, LIMITED_CAMERA_ID, mMockCamcorderProfileHelper);
 
         Preview preview = new Preview.Builder().build();
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder().build();
+        ImageCapture imageCapture = new ImageCapture.Builder().build();
         ImageAnalysis imageAnalysis = new ImageAnalysisConfig.Builder().build();
 
         List<UseCase> useCases = new ArrayList<>();
@@ -560,7 +560,7 @@
         setupCamera(/* supportsRaw= */ false);
 
         Preview preview = new Preview.Builder().build();
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder().build();
+        ImageCapture imageCapture = new ImageCapture.Builder().build();
         ImageAnalysis imageAnalysis = new ImageAnalysisConfig.Builder().build();
         VideoCapture videoCapture = new VideoCaptureConfig.Builder().build();
 
@@ -655,7 +655,7 @@
                 new SupportedSurfaceCombination(
                         mContext, LEGACY_CAMERA_ID, mMockCamcorderProfileHelper);
 
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder()
+        ImageCapture imageCapture = new ImageCapture.Builder()
                 .setTargetAspectRatio(AspectRatio.RATIO_16_9)
                 .build();
         VideoCapture videoCapture = new VideoCaptureConfig.Builder()
@@ -682,7 +682,7 @@
                 new SupportedSurfaceCombination(
                         mContext, LIMITED_CAMERA_ID, mMockCamcorderProfileHelper);
 
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder()
+        ImageCapture imageCapture = new ImageCapture.Builder()
                 .setTargetAspectRatio(AspectRatio.RATIO_16_9)
                 .build();
         VideoCapture videoCapture = new VideoCaptureConfig.Builder()
@@ -718,7 +718,7 @@
         2. supportedOutputSizes for ImageCapture and Preview in
         SupportedSurfaceCombination#getAllPossibleSizeArrangements are the same.
         */
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder()
+        ImageCapture imageCapture = new ImageCapture.Builder()
                 .setTargetResolution(mDisplaySize)
                 .build();
         Preview preview = new Preview.Builder()
@@ -750,7 +750,7 @@
         Preview preview = new Preview.Builder()
                 .setTargetAspectRatio(AspectRatio.RATIO_16_9)
                 .build();
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder()
+        ImageCapture imageCapture = new ImageCapture.Builder()
                 .setTargetAspectRatio(AspectRatio.RATIO_16_9)
                 .build();
         ImageAnalysis imageAnalysis = new ImageAnalysisConfig.Builder()
@@ -795,7 +795,7 @@
         assertTrue(previewExceptionHappened);
 
         boolean imageCaptureExceptionHappened = false;
-        ImageCaptureConfig.Builder imageCaptureConfigBuilder = new ImageCaptureConfig.Builder()
+        ImageCapture.Builder imageCaptureConfigBuilder = new ImageCapture.Builder()
                 .setTargetResolution(mDisplaySize)
                 .setTargetAspectRatio(AspectRatio.RATIO_16_9);
         try {
@@ -831,7 +831,7 @@
         formatResolutionsPairList.add(Pair.create(ImageFormat.PRIVATE, new Size[]{mAnalysisSize}));
 
         // Sets use cases customized supported resolutions to 640x480 only.
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder()
+        ImageCapture imageCapture = new ImageCapture.Builder()
                 .setSupportedResolutions(formatResolutionsPairList)
                 .build();
         VideoCapture videoCapture = new VideoCaptureConfig.Builder()
@@ -1021,7 +1021,7 @@
                 .setTargetAspectRatio(AspectRatio.RATIO_16_9)
                 .setDefaultResolution(mMod16Size)
                 .build();
-        ImageCapture imageCapture = new ImageCaptureConfig.Builder()
+        ImageCapture imageCapture = new ImageCapture.Builder()
                 .setTargetAspectRatio(AspectRatio.RATIO_16_9)
                 .setDefaultResolution(mMod16Size)
                 .build();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java
index 2e095d6..eebf684 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java
@@ -52,7 +52,7 @@
      * <p>When the torch is enabled, the torch will remain enabled during photo capture regardless
      * of {@link FlashMode} setting. When the torch is disabled, flash will function as
      * {@link FlashMode} set by either {@link ImageCapture#setFlashMode(int)} or
-     * {@link ImageCaptureConfig.Builder#setFlashMode(int)}.
+     * {@link ImageCapture.Builder#setFlashMode(int)}.
      *
      * @param torch true to open the torch, false to close it.
      * @return A {@link ListenableFuture} which is successful when the torch was changed to the
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 8ac39dd..6ab4654 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
@@ -16,6 +16,30 @@
 
 package androidx.camera.core;
 
+import static androidx.camera.core.ImageCaptureConfig.OPTION_BUFFER_FORMAT;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_CAMERA_ID_FILTER;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_CAPTURE_BUNDLE;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_CAPTURE_CONFIG_UNPACKER;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_CAPTURE_PROCESSOR;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_DEFAULT_CAPTURE_CONFIG;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_DEFAULT_SESSION_CONFIG;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_FLASH_MODE;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_IMAGE_CAPTURE_MODE;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_IO_EXECUTOR;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_LENS_FACING;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_MAX_CAPTURE_STAGES;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_MAX_RESOLUTION;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_SESSION_CONFIG_UNPACKER;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_SUPPORTED_RESOLUTIONS;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_SURFACE_OCCUPANCY_PRIORITY;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_TARGET_ASPECT_RATIO;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_TARGET_ASPECT_RATIO_CUSTOM;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_TARGET_CLASS;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_TARGET_NAME;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_TARGET_RESOLUTION;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_TARGET_ROTATION;
+import static androidx.camera.core.ImageCaptureConfig.OPTION_USE_CASE_EVENT_CALLBACK;
+
 import android.annotation.SuppressLint;
 import android.graphics.ImageFormat;
 import android.location.Location;
@@ -26,6 +50,7 @@
 import android.os.Looper;
 import android.os.SystemClock;
 import android.util.Log;
+import android.util.Pair;
 import android.util.Rational;
 import android.util.Size;
 import android.view.Display;
@@ -62,6 +87,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.UUID;
 import java.util.concurrent.ConcurrentLinkedDeque;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
@@ -89,6 +115,7 @@
  */
 @SuppressWarnings("ClassCanBeStatic") // TODO(b/141958189): Suppressed during upgrade to AGP 3.6.
 public class ImageCapture extends UseCase {
+
     /**
      * Provides a static configuration with implementation-agnostic options.
      *
@@ -139,9 +166,10 @@
      * by {@link #takePicture(Executor, OnImageCapturedCallback)}
      */
     private final CaptureProcessor mCaptureProcessor;
-    private final ImageCaptureConfig.Builder mUseCaseConfigBuilder;
-    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
-            ImageReaderProxy mImageReader;
+    private final Builder mUseCaseConfigBuilder;
+    /** synthetic accessor */
+    @SuppressWarnings("WeakerAccess")
+    ImageReaderProxy mImageReader;
     /** Callback used to match the {@link ImageProxy} with the {@link ImageInfo}. */
     private CameraCaptureCallback mMetadataMatchingCaptureCallback;
     private ImageCaptureConfig mConfig;
@@ -165,9 +193,9 @@
      * @param userConfig for this use case instance
      * @throws IllegalArgumentException if the configuration is invalid.
      */
-    public ImageCapture(@NonNull ImageCaptureConfig userConfig) {
+    ImageCapture(@NonNull ImageCaptureConfig userConfig) {
         super(userConfig);
-        mUseCaseConfigBuilder = ImageCaptureConfig.Builder.fromConfig(userConfig);
+        mUseCaseConfigBuilder = Builder.fromConfig(userConfig);
         // Ensure we're using the combined configuration (user config + defaults)
         mConfig = (ImageCaptureConfig) getUseCaseConfig();
         mCaptureMode = mConfig.getCaptureMode();
@@ -333,7 +361,7 @@
         ImageCaptureConfig defaults = CameraX.getDefaultUseCaseConfig(
                 ImageCaptureConfig.class, lensFacing);
         if (defaults != null) {
-            return ImageCaptureConfig.Builder.fromConfig(defaults);
+            return Builder.fromConfig(defaults);
         }
 
         return null;
@@ -419,29 +447,26 @@
      * Sets the desired rotation of the output image.
      *
      * <p>This will affect the EXIF rotation metadata in images saved by takePicture calls and the
-     * rotation value returned by {@link OnImageCapturedCallback}.  These will be set
-     * to be the rotation, which if applied to the output image data, will make the image match
-     * target rotation specified here.
+     * rotation value returned by {@link OnImageCapturedCallback}.  These will be set to be the
+     * rotation, which if applied to the output image data, will make the image match target
+     * rotation specified here.
      *
-     * <p>While rotation can also be set via
-     * {@link ImageCaptureConfig.Builder#setTargetRotation(int)}, using
+     * <p>While rotation can also be set via {@link Builder#setTargetRotation(int)}, using
      * {@link ImageCapture#setTargetRotation(int)} allows the target rotation to be set dynamically.
      *
      * <p>In general, it is best to use an {@link android.view.OrientationEventListener} to
-     * set the target rotation.  This way, the rotation output will indicate
-     * which way is down for a given image.  This is important since display orientation may be
-     * locked by device default, user setting, or app configuration,
-     * and some devices may not transition to a reverse-portrait display orientation.  In
-     * these cases, use {@link androidx.camera.core.ImageCapture#setTargetRotation} to set
-     * target rotation dynamically according to the
-     * {@link android.view.OrientationEventListener}, without re-creating the use case.  Note
+     * set the target rotation.  This way, the rotation output will indicate which way is down for
+     * a given image.  This is important since display orientation may be locked by device
+     * default, user setting, or app configuration, and some devices may not transition to a
+     * reverse-portrait display orientation. In these cases,
+     * use {@link ImageCapture#setTargetRotation} to set target rotation dynamically according to
+     * the {@link android.view.OrientationEventListener}, without re-creating the use case.  Note
      * the OrientationEventListener output of degrees in the range [0..359] should be converted to
      * a surface rotation, i.e. one of {@link Surface#ROTATION_0}, {@link Surface#ROTATION_90},
      * {@link Surface#ROTATION_180}, or {@link Surface#ROTATION_270}.
      *
      * <p>If no target rotation is set by the application, it is set to the value of
-     * {@link Display#getRotation()} of the default display at the time the
-     * use case is created.
+     * {@link Display#getRotation()} of the default display at the time the use case is created.
      *
      * <p>takePicture uses the target rotation at the time it begins executing (which may be delayed
      * waiting on a previous takePicture call to complete).
@@ -1167,7 +1192,7 @@
          * A rotation of 90 degrees would mean rotating the image 90 degrees clockwise produces an
          * image that will match the display orientation.
          *
-         * <p>See also {@link ImageCaptureConfig.Builder#setTargetRotation(int)} and
+         * <p>See also {@link Builder#setTargetRotation(int)} and
          * {@link #setTargetRotation(int)}.
          *
          * <p>Timestamps are in nanoseconds and monotonic and can be compared to timestamps from
@@ -1220,8 +1245,8 @@
         private static final ImageCaptureConfig DEFAULT_CONFIG;
 
         static {
-            ImageCaptureConfig.Builder builder =
-                    new ImageCaptureConfig.Builder()
+            Builder builder =
+                    new Builder()
                             .setCaptureMode(DEFAULT_CAPTURE_MODE)
                             .setFlashMode(DEFAULT_FLASH_MODE)
                             .setSurfaceOccupancyPriority(DEFAULT_SURFACE_OCCUPANCY_PRIORITY);
@@ -1507,4 +1532,511 @@
             }
         }
     }
+
+    /** Builder for an {@link ImageCapture}. */
+    public static final class Builder implements
+            UseCaseConfig.Builder<ImageCapture, ImageCaptureConfig, Builder>,
+            ImageOutputConfig.Builder<Builder>,
+            CameraDeviceConfig.Builder<Builder>,
+            IoConfig.Builder<Builder> {
+
+        private final MutableOptionsBundle mMutableConfig;
+
+        /** Creates a new Builder object. */
+        public Builder() {
+            this(MutableOptionsBundle.create());
+        }
+
+        private Builder(MutableOptionsBundle mutableConfig) {
+            mMutableConfig = mutableConfig;
+
+            Class<?> oldConfigClass =
+                    mutableConfig.retrieveOption(TargetConfig.OPTION_TARGET_CLASS, null);
+            if (oldConfigClass != null && !oldConfigClass.equals(ImageCapture.class)) {
+                throw new IllegalArgumentException(
+                        "Invalid target class configuration for "
+                                + Builder.this
+                                + ": "
+                                + oldConfigClass);
+            }
+
+            setTargetClass(ImageCapture.class);
+        }
+
+        /**
+         * Generates a Builder from another Config object
+         *
+         * @param configuration An immutable configuration to pre-populate this builder.
+         * @return The new Builder.
+         */
+        @NonNull
+        public static Builder fromConfig(@NonNull ImageCaptureConfig configuration) {
+            return new Builder(MutableOptionsBundle.from(configuration));
+        }
+
+        /**
+         * {@inheritDoc}
+         *
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public MutableConfig getMutableConfig() {
+            return mMutableConfig;
+        }
+
+        /**
+         * {@inheritDoc}
+         *
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        @Override
+        public ImageCaptureConfig getUseCaseConfig() {
+            return new ImageCaptureConfig(OptionsBundle.from(mMutableConfig));
+        }
+
+        /**
+         * Builds an immutable {@link ImageCapture} from the current state.
+         *
+         * @return A {@link ImageCapture} populated with the current state.
+         * @throws IllegalArgumentException if attempting to set both target aspect ratio and
+         *                                  target resolution.
+         */
+        @Override
+        @NonNull
+        public ImageCapture build() {
+            // Error at runtime for using both setTargetResolution and setTargetAspectRatio on
+            // the same config.
+            if (getMutableConfig().retrieveOption(OPTION_TARGET_ASPECT_RATIO, null) != null
+                    && getMutableConfig().retrieveOption(OPTION_TARGET_RESOLUTION, null) != null) {
+                throw new IllegalArgumentException(
+                        "Cannot use both setTargetResolution and setTargetAspectRatio on the same "
+                                + "config.");
+            }
+            return new ImageCapture(getUseCaseConfig());
+        }
+
+        /**
+         * Sets the image capture mode.
+         *
+         * <p>Valid capture modes are {@link CaptureMode#MIN_LATENCY}, which prioritizes latency
+         * over image quality, or {@link CaptureMode#MAX_QUALITY}, which prioritizes image quality
+         * over latency.
+         *
+         * <p>If not set, the capture mode will default to {@link CaptureMode#MIN_LATENCY}.
+         *
+         * @param captureMode The requested image capture mode.
+         * @return The current Builder.
+         */
+        @NonNull
+        public Builder setCaptureMode(@NonNull CaptureMode captureMode) {
+            getMutableConfig().insertOption(OPTION_IMAGE_CAPTURE_MODE, captureMode);
+            return this;
+        }
+
+        /**
+         * Sets the {@link FlashMode}.
+         *
+         * <p>If not set, the flash mode will default to {@link FlashMode#OFF}.
+         *
+         * <p>See {@link ImageCapture#setFlashMode(int)} for more information.
+         *
+         * @param flashMode The requested flash mode.
+         * @return The current Builder.
+         */
+        @NonNull
+        public Builder setFlashMode(@FlashMode int flashMode) {
+            getMutableConfig().insertOption(OPTION_FLASH_MODE, flashMode);
+            return this;
+        }
+
+        /**
+         * Sets the {@link CaptureBundle}.
+         *
+         * @param captureBundle The requested capture bundle for extension.
+         * @return The current Builder.
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public Builder setCaptureBundle(@NonNull CaptureBundle captureBundle) {
+            getMutableConfig().insertOption(OPTION_CAPTURE_BUNDLE, captureBundle);
+            return this;
+        }
+
+        /**
+         * Sets the {@link CaptureProcessor}.
+         *
+         * @param captureProcessor The requested capture processor for extension.
+         * @return The current Builder.
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public Builder setCaptureProcessor(@NonNull CaptureProcessor captureProcessor) {
+            getMutableConfig().insertOption(OPTION_CAPTURE_PROCESSOR, captureProcessor);
+            return this;
+        }
+
+        /**
+         * Sets the {@link ImageFormat} of the {@link ImageProxy} returned by the
+         * {@link ImageCapture.OnImageCapturedCallback}.
+         *
+         * <p>Warning. This could lead to an invalid configuration as image format support is per
+         * device. Also, setting the buffer format in conjuncture with image capture extensions will
+         * result in an invalid configuration. In this case {@link
+         * ImageCapture#ImageCapture(ImageCaptureConfig)} will throw an
+         * {@link IllegalArgumentException}.
+         *
+         * @param bufferImageFormat The image format for captured images.
+         * @return The current Builder.
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public Builder setBufferFormat(int bufferImageFormat) {
+            getMutableConfig().insertOption(OPTION_BUFFER_FORMAT, bufferImageFormat);
+            return this;
+        }
+
+        /**
+         * Sets the max number of {@link CaptureStage}.
+         *
+         * @param maxCaptureStages The max CaptureStage number.
+         * @return The current Builder.
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        public Builder setMaxCaptureStages(int maxCaptureStages) {
+            getMutableConfig().insertOption(OPTION_MAX_CAPTURE_STAGES, maxCaptureStages);
+            return this;
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setSupportedResolutions(@NonNull List<Pair<Integer, Size[]>> resolutions) {
+            getMutableConfig().insertOption(OPTION_SUPPORTED_RESOLUTIONS, resolutions);
+            return this;
+        }
+
+        // Implementations of TargetConfig.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setTargetClass(@NonNull Class<ImageCapture> targetClass) {
+            getMutableConfig().insertOption(OPTION_TARGET_CLASS, targetClass);
+
+            // If no name is set yet, then generate a unique name
+            if (null == getMutableConfig().retrieveOption(OPTION_TARGET_NAME, null)) {
+                String targetName = targetClass.getCanonicalName() + "-" + UUID.randomUUID();
+                setTargetName(targetName);
+            }
+
+            return this;
+        }
+
+        /**
+         * Sets the name of the target object being configured, used only for debug logging.
+         *
+         * <p>The name should be a value that can uniquely identify an instance of the object being
+         * configured.
+         *
+         * <p>If not set, the target name will default to a unique name automatically generated
+         * with the class canonical name and random UUID.
+         *
+         * @param targetName A unique string identifier for the instance of the class being
+         *                   configured.
+         * @return the current Builder.
+         */
+        @Override
+        @NonNull
+        public Builder setTargetName(@NonNull String targetName) {
+            getMutableConfig().insertOption(OPTION_TARGET_NAME, targetName);
+            return this;
+        }
+
+        // Implementations of CameraDeviceConfig.Builder default methods
+
+        /**
+         * Sets the primary camera to be configured based on the direction the lens is facing.
+         *
+         * <p>If multiple cameras exist with equivalent lens facing direction, the first ("primary")
+         * camera for that direction will be chosen.
+         *
+         * @param lensFacing The direction of the camera's lens.
+         * @return the current Builder.
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setLensFacing(@NonNull LensFacing lensFacing) {
+            getMutableConfig().insertOption(OPTION_LENS_FACING, lensFacing);
+            return this;
+        }
+
+        /**
+         * Sets a {@link CameraIdFilter} that filter out the unavailable camera id.
+         *
+         * <p>The camera id filter will be used to filter those cameras with lens facing
+         * specified in the config.
+         *
+         * @param cameraIdFilter The {@link CameraIdFilter}.
+         * @return the current Builder.
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setCameraIdFilter(@NonNull CameraIdFilter cameraIdFilter) {
+            getMutableConfig().insertOption(OPTION_CAMERA_ID_FILTER, cameraIdFilter);
+            return this;
+        }
+
+        // Implementations of ImageOutputConfig.Builder default methods
+
+        /**
+         * Sets the aspect ratio of the intended target for images from this configuration.
+         *
+         * <p>This is the ratio of the target's width to the image's height, where the numerator of
+         * the provided {@link Rational} corresponds to the width, and the denominator corresponds
+         * to the height.
+         *
+         * <p>The target aspect ratio is used as a hint when determining the resulting output aspect
+         * ratio which may differ from the request, possibly due to device constraints.
+         * Application code should check the resulting output's resolution.
+         *
+         * <p>This method can be used to request an aspect ratio that is not from the standard set
+         * of aspect ratios defined in the {@link AspectRatio}.
+         *
+         * <p>This method will remove any value set by setTargetAspectRatio().
+         *
+         * <p>For ImageCapture, the outputs are the {@link ImageProxy} or the File passed to image
+         * capture listeners.
+         *
+         * @param aspectRatio A {@link Rational} representing the ratio of the target's width and
+         *                    height.
+         * @return The current Builder.
+         * @hide
+         */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @NonNull
+        @Override
+        public Builder setTargetAspectRatioCustom(@NonNull Rational aspectRatio) {
+            getMutableConfig().insertOption(OPTION_TARGET_ASPECT_RATIO_CUSTOM, aspectRatio);
+            getMutableConfig().removeOption(OPTION_TARGET_ASPECT_RATIO);
+            return this;
+        }
+
+        /**
+         * Sets the aspect ratio of the intended target for images from this configuration.
+         *
+         * <p>It is not allowed to set both target aspect ratio and target resolution on the same
+         * use case.  Attempting so will throw an IllegalArgumentException when building the
+         * Config.
+         *
+         * <p>The target aspect ratio is used as a hint when determining the resulting output aspect
+         * ratio which may differ from the request, possibly due to device constraints.
+         * Application code should check the resulting output's resolution.
+         *
+         * <p>If not set, resolutions with aspect ratio 4:3 will be considered in higher
+         * priority.
+         *
+         * @param aspectRatio A {@link AspectRatio} representing the ratio of the
+         *                    target's width and height.
+         * @return The current Builder.
+         */
+        @NonNull
+        @Override
+        public Builder setTargetAspectRatio(@AspectRatio int aspectRatio) {
+            getMutableConfig().insertOption(OPTION_TARGET_ASPECT_RATIO, aspectRatio);
+            return this;
+        }
+
+        /**
+         * Sets the rotation of the intended target for images from this configuration.
+         *
+         * <p>This will affect the EXIF rotation metadata in images saved by takePicture calls and
+         * the rotation value returned by
+         * {@link androidx.camera.core.ImageCapture.OnImageCapturedCallback}.  These will be set to
+         * be the rotation, which if applied to the output image data, will make the image match the
+         * target rotation specified here.
+         *
+         * <p>This is one of four valid values: {@link Surface#ROTATION_0}, {@link
+         * Surface#ROTATION_90}, {@link Surface#ROTATION_180}, {@link Surface#ROTATION_270}.
+         * Rotation values are relative to the "natural" rotation, {@link Surface#ROTATION_0}.
+         *
+         * <p>In general, it is best to additionally set the target rotation dynamically on the use
+         * case.  See {@link androidx.camera.core.ImageCapture#setTargetRotation(int)} for
+         * additional documentation.
+         *
+         * <p>If not set, the target rotation will default to the value of
+         * {@link android.view.Display#getRotation()} of the default display at the time the use
+         * case is created.
+         *
+         * @param rotation The rotation of the intended target.
+         * @return The current Builder.
+         * @see androidx.camera.core.ImageCapture#setTargetRotation(int)
+         * @see android.view.OrientationEventListener
+         */
+        @NonNull
+        @Override
+        public Builder setTargetRotation(@RotationValue int rotation) {
+            getMutableConfig().insertOption(OPTION_TARGET_ROTATION, rotation);
+            return this;
+        }
+
+        /**
+         * Sets the intended output target resolution.
+         *
+         * <p>The target resolution attempts to establish a minimum bound for the image resolution.
+         * The actual image resolution will be the closest available resolution in size that is not
+         * smaller than the target resolution, as determined by the Camera implementation. However,
+         * if no resolution exists that is equal to or larger than the target resolution, the
+         * nearest available resolution smaller than the target resolution will be chosen.
+         * Resolutions with the same aspect ratio of the provided {@link Size} will be considered in
+         * higher priority before resolutions of different aspect ratios.
+         *
+         * <p>It is not allowed to set both target aspect ratio and target resolution on the same
+         * use case.  Attempting so will throw an IllegalArgumentException when building the
+         * Config.
+         *
+         * <p>The resolution {@link Size} should be expressed at the use cases's target rotation.
+         * For example, a device with portrait natural orientation in natural target rotation
+         * requesting a portrait image may specify 480x640, and the same device, rotated 90 degrees
+         * and targeting landscape orientation may specify 640x480.
+         *
+         * <p>The maximum available resolution that could be selected for an {@link ImageCapture}
+         * will depend on the camera device's capability.
+         *
+         * <p>If not set, the largest available resolution will be selected to use. Usually,
+         * users will intend to get the largest still image that the camera device can support.
+         *
+         * @param resolution The target resolution to choose from supported output sizes list.
+         * @return The current Builder.
+         */
+        @NonNull
+        @Override
+        public Builder setTargetResolution(@NonNull Size resolution) {
+            getMutableConfig().insertOption(OPTION_TARGET_RESOLUTION, resolution);
+            if (resolution != null) {
+                getMutableConfig().insertOption(OPTION_TARGET_ASPECT_RATIO_CUSTOM,
+                        new Rational(resolution.getWidth(), resolution.getHeight()));
+            }
+            return this;
+        }
+
+        /**
+         * Sets the default resolution of the intended target from this configuration.
+         *
+         * @param resolution The default resolution to choose from supported output sizes list.
+         * @return The current Builder.
+         * @hide
+         */
+        @NonNull
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setDefaultResolution(@NonNull Size resolution) {
+            getMutableConfig().insertOption(ImageOutputConfig.OPTION_DEFAULT_RESOLUTION,
+                    resolution);
+            return this;
+        }
+
+        /** @hide */
+        @NonNull
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setMaxResolution(@NonNull Size resolution) {
+            getMutableConfig().insertOption(OPTION_MAX_RESOLUTION, resolution);
+            return this;
+        }
+
+        // Implementations of IoConfig.Builder default methods
+
+        /**
+         * Sets the default executor that will be used for IO tasks.
+         *
+         * <p> This executor will be used for any IO tasks specifically for ImageCapture, such as
+         * {@link ImageCapture#takePicture(File, Executor, ImageCapture.OnImageSavedCallback)}
+         * and {@link ImageCapture#takePicture(File, ImageCapture.Metadata, Executor,
+         * ImageCapture.OnImageSavedCallback)}. If no executor is set, then a default Executor
+         * specifically for IO will be used instead.
+         *
+         * @param executor The executor which will be used for IO tasks.
+         * @return the current Builder.
+         */
+        @Override
+        @NonNull
+        public Builder setIoExecutor(@NonNull Executor executor) {
+            getMutableConfig().insertOption(OPTION_IO_EXECUTOR, executor);
+            return this;
+        }
+
+        // Implementations of UseCaseConfig.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setDefaultSessionConfig(@NonNull SessionConfig sessionConfig) {
+            getMutableConfig().insertOption(OPTION_DEFAULT_SESSION_CONFIG, sessionConfig);
+            return this;
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setDefaultCaptureConfig(@NonNull CaptureConfig captureConfig) {
+            getMutableConfig().insertOption(OPTION_DEFAULT_CAPTURE_CONFIG, captureConfig);
+            return this;
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setSessionOptionUnpacker(
+                @NonNull SessionConfig.OptionUnpacker optionUnpacker) {
+            getMutableConfig().insertOption(OPTION_SESSION_CONFIG_UNPACKER, optionUnpacker);
+            return this;
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setCaptureOptionUnpacker(
+                @NonNull CaptureConfig.OptionUnpacker optionUnpacker) {
+            getMutableConfig().insertOption(OPTION_CAPTURE_CONFIG_UNPACKER, optionUnpacker);
+            return this;
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setSurfaceOccupancyPriority(int priority) {
+            getMutableConfig().insertOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, priority);
+            return this;
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @NonNull
+        public Builder setUseCaseEventCallback(
+                @NonNull UseCase.EventCallback useCaseEventCallback) {
+            getMutableConfig().insertOption(OPTION_USE_CASE_EVENT_CALLBACK, useCaseEventCallback);
+            return this;
+        }
+    }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageCaptureConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageCaptureConfig.java
index fc6971c..5016e25 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageCaptureConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageCaptureConfig.java
@@ -31,10 +31,14 @@
 import java.io.File;
 import java.util.List;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.Executor;
 
-/** Configuration for an image capture use case. */
+/**
+ * Configuration for an image capture use case.
+ *
+ * @hide
+ */
+@RestrictTo(Scope.LIBRARY_GROUP)
 public final class ImageCaptureConfig
         implements UseCaseConfig<ImageCapture>,
         ImageOutputConfig,
@@ -687,513 +691,4 @@
 
     // End of the default implementation of Config
     // *********************************************************************************************
-
-    /** Builder for a {@link ImageCaptureConfig}. */
-    public static final class Builder
-            implements UseCaseConfig.Builder<
-            ImageCapture, ImageCaptureConfig, Builder>,
-            ImageOutputConfig.Builder<Builder>,
-            CameraDeviceConfig.Builder<Builder>,
-            IoConfig.Builder<Builder> {
-
-        private final MutableOptionsBundle mMutableConfig;
-
-        /** Creates a new Builder object. */
-        public Builder() {
-            this(MutableOptionsBundle.create());
-        }
-
-        private Builder(MutableOptionsBundle mutableConfig) {
-            mMutableConfig = mutableConfig;
-
-            Class<?> oldConfigClass =
-                    mutableConfig.retrieveOption(TargetConfig.OPTION_TARGET_CLASS, null);
-            if (oldConfigClass != null && !oldConfigClass.equals(ImageCapture.class)) {
-                throw new IllegalArgumentException(
-                        "Invalid target class configuration for "
-                                + Builder.this
-                                + ": "
-                                + oldConfigClass);
-            }
-
-            setTargetClass(ImageCapture.class);
-        }
-
-        /**
-         * Generates a Builder from another Config object
-         *
-         * @param configuration An immutable configuration to pre-populate this builder.
-         * @return The new Builder.
-         */
-        @NonNull
-        public static Builder fromConfig(@NonNull ImageCaptureConfig configuration) {
-            return new Builder(MutableOptionsBundle.from(configuration));
-        }
-
-        /**
-         * {@inheritDoc}
-         *
-         * @hide
-         */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @Override
-        @NonNull
-        public MutableConfig getMutableConfig() {
-            return mMutableConfig;
-        }
-
-        /**
-         * {@inheritDoc}
-         *
-         * @hide
-         */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        @Override
-        public ImageCaptureConfig getUseCaseConfig() {
-            return new ImageCaptureConfig(OptionsBundle.from(mMutableConfig));
-        }
-
-        /**
-         * Builds an immutable {@link ImageCaptureConfig} from the current state.
-         *
-         * @return A {@link ImageCaptureConfig} populated with the current state.
-         * @throws IllegalArgumentException if attempting to set both target aspect ratio and
-         *                                  target resolution.
-         */
-        @Override
-        @NonNull
-        public ImageCapture build() {
-            // Error at runtime for using both setTargetResolution and setTargetAspectRatio on
-            // the same config.
-            if (getMutableConfig().retrieveOption(OPTION_TARGET_ASPECT_RATIO, null) != null
-                    && getMutableConfig().retrieveOption(OPTION_TARGET_RESOLUTION, null) != null) {
-                throw new IllegalArgumentException(
-                        "Cannot use both setTargetResolution and setTargetAspectRatio on the same "
-                                + "config.");
-            }
-            return new ImageCapture(getUseCaseConfig());
-        }
-
-        /**
-         * Sets the image capture mode.
-         *
-         * <p>Valid capture modes are {@link CaptureMode#MIN_LATENCY}, which prioritizes latency
-         * over image quality, or {@link CaptureMode#MAX_QUALITY}, which prioritizes image quality
-         * over latency.
-         *
-         * <p>If not set, the capture mode will default to {@link CaptureMode#MIN_LATENCY}.
-         *
-         * @param captureMode The requested image capture mode.
-         * @return The current Builder.
-         */
-        @NonNull
-        public Builder setCaptureMode(@NonNull CaptureMode captureMode) {
-            getMutableConfig().insertOption(OPTION_IMAGE_CAPTURE_MODE, captureMode);
-            return this;
-        }
-
-        /**
-         * Sets the {@link FlashMode}.
-         *
-         * <p>If not set, the flash mode will default to {@link FlashMode#OFF}.
-         *
-         * <p>See {@link ImageCapture#setFlashMode(int)} for more information.
-         *
-         * @param flashMode The requested flash mode.
-         * @return The current Builder.
-         */
-        @NonNull
-        public Builder setFlashMode(@FlashMode int flashMode) {
-            getMutableConfig().insertOption(OPTION_FLASH_MODE, flashMode);
-            return this;
-        }
-
-        /**
-         * Sets the {@link CaptureBundle}.
-         *
-         * @param captureBundle The requested capture bundle for extension.
-         * @return The current Builder.
-         * @hide
-         */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public Builder setCaptureBundle(@NonNull CaptureBundle captureBundle) {
-            getMutableConfig().insertOption(OPTION_CAPTURE_BUNDLE, captureBundle);
-            return this;
-        }
-
-        /**
-         * Sets the {@link CaptureProcessor}.
-         *
-         * @param captureProcessor The requested capture processor for extension.
-         * @return The current Builder.
-         * @hide
-         */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public Builder setCaptureProcessor(@NonNull CaptureProcessor captureProcessor) {
-            getMutableConfig().insertOption(OPTION_CAPTURE_PROCESSOR, captureProcessor);
-            return this;
-        }
-
-        /**
-         * Sets the {@link ImageFormat} of the {@link ImageProxy} returned by the
-         * {@link ImageCapture.OnImageCapturedCallback}.
-         *
-         * <p>Warning. This could lead to an invalid configuration as image format support is per
-         * device. Also, setting the buffer format in conjuncture with image capture extensions will
-         * result in an invalid configuration. In this case {@link
-         * ImageCapture#ImageCapture(ImageCaptureConfig)} will throw an
-         * {@link IllegalArgumentException}.
-         *
-         * @param bufferImageFormat The image format for captured images.
-         * @return The current Builder.
-         * @hide
-         */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public Builder setBufferFormat(int bufferImageFormat) {
-            getMutableConfig().insertOption(OPTION_BUFFER_FORMAT, bufferImageFormat);
-            return this;
-        }
-
-        /**
-         * Sets the max number of {@link CaptureStage}.
-         *
-         * @param maxCaptureStages The max CaptureStage number.
-         * @return The current Builder.
-         * @hide
-         */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        public Builder setMaxCaptureStages(int maxCaptureStages) {
-            getMutableConfig().insertOption(OPTION_MAX_CAPTURE_STAGES, maxCaptureStages);
-            return this;
-        }
-
-        /** @hide */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @Override
-        @NonNull
-        public Builder setSupportedResolutions(@NonNull List<Pair<Integer, Size[]>> resolutions) {
-            getMutableConfig().insertOption(OPTION_SUPPORTED_RESOLUTIONS, resolutions);
-            return this;
-        }
-
-        // Implementations of TargetConfig.Builder default methods
-
-        /** @hide */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @Override
-        @NonNull
-        public Builder setTargetClass(@NonNull Class<ImageCapture> targetClass) {
-            getMutableConfig().insertOption(OPTION_TARGET_CLASS, targetClass);
-
-            // If no name is set yet, then generate a unique name
-            if (null == getMutableConfig().retrieveOption(OPTION_TARGET_NAME, null)) {
-                String targetName = targetClass.getCanonicalName() + "-" + UUID.randomUUID();
-                setTargetName(targetName);
-            }
-
-            return this;
-        }
-
-        /**
-         * Sets the name of the target object being configured, used only for debug logging.
-         *
-         * <p>The name should be a value that can uniquely identify an instance of the object being
-         * configured.
-         *
-         * <p>If not set, the target name will default to an unique name automatically generated
-         * with the class canonical name and random UUID.
-         *
-         * @param targetName A unique string identifier for the instance of the class being
-         *                   configured.
-         * @return the current Builder.
-         */
-        @Override
-        @NonNull
-        public Builder setTargetName(@NonNull String targetName) {
-            getMutableConfig().insertOption(OPTION_TARGET_NAME, targetName);
-            return this;
-        }
-
-        // Implementations of CameraDeviceConfig.Builder default methods
-
-        /**
-         * Sets the primary camera to be configured based on the direction the lens is facing.
-         *
-         * <p>If multiple cameras exist with equivalent lens facing direction, the first ("primary")
-         * camera for that direction will be chosen.
-         *
-         * @param lensFacing The direction of the camera's lens.
-         * @return the current Builder.
-         * @hide
-         */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @Override
-        @NonNull
-        public Builder setLensFacing(@NonNull LensFacing lensFacing) {
-            getMutableConfig().insertOption(OPTION_LENS_FACING, lensFacing);
-            return this;
-        }
-
-        /**
-         * Sets a {@link CameraIdFilter} that filter out the unavailable camera id.
-         *
-         * <p>The camera id filter will be used to filter those cameras with lens facing
-         * specified in the config.
-         *
-         * @param cameraIdFilter The {@link CameraIdFilter}.
-         * @return the current Builder.
-         * @hide
-         */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @Override
-        @NonNull
-        public Builder setCameraIdFilter(@NonNull CameraIdFilter cameraIdFilter) {
-            getMutableConfig().insertOption(OPTION_CAMERA_ID_FILTER, cameraIdFilter);
-            return this;
-        }
-
-        // Implementations of ImageOutputConfig.Builder default methods
-
-        /**
-         * Sets the aspect ratio of the intended target for images from this configuration.
-         *
-         * <p>This is the ratio of the target's width to the image's height, where the numerator of
-         * the provided {@link Rational} corresponds to the width, and the denominator corresponds
-         * to the height.
-         *
-         * <p>The target aspect ratio is used as a hint when determining the resulting output aspect
-         * ratio which may differ from the request, possibly due to device constraints.
-         * Application code should check the resulting output's resolution.
-         *
-         * <p>This method can be used to request an aspect ratio that is not from the standard set
-         * of aspect ratios defined in the {@link AspectRatio}.
-         *
-         * <p>This method will remove any value set by setTargetAspectRatio().
-         *
-         * <p>For ImageCapture, the outputs are the {@link ImageProxy} or the File passed to image
-         * capture listeners.
-         *
-         * @param aspectRatio A {@link Rational} representing the ratio of the target's width and
-         *                    height.
-         * @return The current Builder.
-         * @hide
-         */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @NonNull
-        @Override
-        public Builder setTargetAspectRatioCustom(@NonNull Rational aspectRatio) {
-            getMutableConfig().insertOption(OPTION_TARGET_ASPECT_RATIO_CUSTOM, aspectRatio);
-            getMutableConfig().removeOption(OPTION_TARGET_ASPECT_RATIO);
-            return this;
-        }
-
-        /**
-         * Sets the aspect ratio of the intended target for images from this configuration.
-         *
-         * <p>It is not allowed to set both target aspect ratio and target resolution on the same
-         * use case.  Attempting so will throw an IllegalArgumentException when building the
-         * Config.
-         *
-         * <p>The target aspect ratio is used as a hint when determining the resulting output aspect
-         * ratio which may differ from the request, possibly due to device constraints.
-         * Application code should check the resulting output's resolution.
-         *
-         * <p>If not set, resolutions with aspect ratio 4:3 will be considered in higher
-         * priority.
-         *
-         * @param aspectRatio A {@link AspectRatio} representing the ratio of the
-         *                    target's width and height.
-         * @return The current Builder.
-         */
-        @NonNull
-        @Override
-        public Builder setTargetAspectRatio(@AspectRatio int aspectRatio) {
-            getMutableConfig().insertOption(OPTION_TARGET_ASPECT_RATIO, aspectRatio);
-            return this;
-        }
-
-        /**
-         * Sets the rotation of the intended target for images from this configuration.
-         *
-         * <p>This will affect the EXIF rotation metadata in images saved by takePicture calls and
-         * the rotation value returned by
-         * {@link androidx.camera.core.ImageCapture.OnImageCapturedCallback}.  These will be set to
-         * be the rotation, which if applied to the output image data, will make the image match the
-         * target rotation specified here.
-         *
-         * <p>This is one of four valid values: {@link Surface#ROTATION_0}, {@link
-         * Surface#ROTATION_90}, {@link Surface#ROTATION_180}, {@link Surface#ROTATION_270}.
-         * Rotation values are relative to the "natural" rotation, {@link Surface#ROTATION_0}.
-         *
-         * <p>In general, it is best to additionally set the target rotation dynamically on the use
-         * case.  See {@link androidx.camera.core.ImageCapture#setTargetRotation(int)} for
-         * additional documentation.
-         *
-         * <p>If not set, the target rotation will default to the value of
-         * {@link android.view.Display#getRotation()} of the default display at the time the use
-         * case is created.
-         *
-         * @see androidx.camera.core.ImageCapture#setTargetRotation(int)
-         * @see android.view.OrientationEventListener
-         *
-         * @param rotation The rotation of the intended target.
-         * @return The current Builder.
-         */
-        @NonNull
-        @Override
-        public Builder setTargetRotation(@RotationValue int rotation) {
-            getMutableConfig().insertOption(OPTION_TARGET_ROTATION, rotation);
-            return this;
-        }
-
-        /**
-         * Sets the intended output target resolution.
-         *
-         * <p>The target resolution attempts to establish a minimum bound for the image resolution.
-         * The actual image resolution will be the closest available resolution in size that is not
-         * smaller than the target resolution, as determined by the Camera implementation. However,
-         * if no resolution exists that is equal to or larger than the target resolution, the
-         * nearest available resolution smaller than the target resolution will be chosen.
-         * Resolutions with the same aspect ratio of the provided {@link Size} will be considered in
-         * higher priority before resolutions of different aspect ratios.
-         *
-         * <p>It is not allowed to set both target aspect ratio and target resolution on the same
-         * use case.  Attempting so will throw an IllegalArgumentException when building the
-         * Config.
-         *
-         * <p>The resolution {@link Size} should be expressed at the use cases's target rotation.
-         * For example, a device with portrait natural orientation in natural target rotation
-         * requesting a portrait image may specify 480x640, and the same device, rotated 90 degrees
-         * and targeting landscape orientation may specify 640x480.
-         *
-         * <p>The maximum available resolution that could be selected for an {@link ImageCapture}
-         * will depend on the camera device's capability.
-         *
-         * <p>If not set, the largest available resolution will be selected to use. Usually,
-         * users will intend to get the largest still image that the camera device can support.
-         *
-         * @param resolution The target resolution to choose from supported output sizes list.
-         * @return The current Builder.
-         */
-        @NonNull
-        @Override
-        public Builder setTargetResolution(@NonNull Size resolution) {
-            getMutableConfig().insertOption(OPTION_TARGET_RESOLUTION, resolution);
-            if (resolution != null) {
-                getMutableConfig().insertOption(OPTION_TARGET_ASPECT_RATIO_CUSTOM,
-                        new Rational(resolution.getWidth(), resolution.getHeight()));
-            }
-            return this;
-        }
-
-        /**
-         * Sets the default resolution of the intended target from this configuration.
-         *
-         * @param resolution The default resolution to choose from supported output sizes list.
-         * @return The current Builder.
-         * @hide
-         */
-        @NonNull
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @Override
-        public Builder setDefaultResolution(@NonNull Size resolution) {
-            getMutableConfig().insertOption(ImageOutputConfig.OPTION_DEFAULT_RESOLUTION,
-                    resolution);
-            return this;
-        }
-
-        /** @hide */
-        @NonNull
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @Override
-        public Builder setMaxResolution(@NonNull Size resolution) {
-            getMutableConfig().insertOption(OPTION_MAX_RESOLUTION, resolution);
-            return this;
-        }
-
-        // Implementations of IoConfig.Builder default methods
-
-        /**
-         * Sets the default executor that will be used for IO tasks.
-         *
-         * <p> This executor will be used for any IO tasks specifically for ImageCapture, such as
-         * {@link ImageCapture#takePicture(File, Executor, ImageCapture.OnImageSavedCallback)}
-         * and {@link ImageCapture#takePicture(File, ImageCapture.Metadata, Executor,
-         * ImageCapture.OnImageSavedCallback)}. If no executor is set, then a default Executor
-         * specifically for IO will be used instead.
-         *
-         * @param executor The executor which will be used for IO tasks.
-         * @return the current Builder.
-         */
-        @Override
-        @NonNull
-        public Builder setIoExecutor(@NonNull Executor executor) {
-            getMutableConfig().insertOption(OPTION_IO_EXECUTOR, executor);
-            return this;
-        }
-
-        // Implementations of UseCaseConfig.Builder default methods
-
-        /** @hide */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @Override
-        @NonNull
-        public Builder setDefaultSessionConfig(@NonNull SessionConfig sessionConfig) {
-            getMutableConfig().insertOption(OPTION_DEFAULT_SESSION_CONFIG, sessionConfig);
-            return this;
-        }
-
-        /** @hide */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @Override
-        @NonNull
-        public Builder setDefaultCaptureConfig(@NonNull CaptureConfig captureConfig) {
-            getMutableConfig().insertOption(OPTION_DEFAULT_CAPTURE_CONFIG, captureConfig);
-            return this;
-        }
-
-        /** @hide */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @Override
-        @NonNull
-        public Builder setSessionOptionUnpacker(
-                @NonNull SessionConfig.OptionUnpacker optionUnpacker) {
-            getMutableConfig().insertOption(OPTION_SESSION_CONFIG_UNPACKER, optionUnpacker);
-            return this;
-        }
-
-        /** @hide */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @Override
-        @NonNull
-        public Builder setCaptureOptionUnpacker(
-                @NonNull CaptureConfig.OptionUnpacker optionUnpacker) {
-            getMutableConfig().insertOption(OPTION_CAPTURE_CONFIG_UNPACKER, optionUnpacker);
-            return this;
-        }
-
-        /** @hide */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @Override
-        @NonNull
-        public Builder setSurfaceOccupancyPriority(int priority) {
-            getMutableConfig().insertOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, priority);
-            return this;
-        }
-
-        /** @hide */
-        @RestrictTo(Scope.LIBRARY_GROUP)
-        @Override
-        @NonNull
-        public Builder setUseCaseEventCallback(
-                @NonNull UseCase.EventCallback useCaseEventCallback) {
-            getMutableConfig().insertOption(OPTION_USE_CASE_EVENT_CALLBACK, useCaseEventCallback);
-            return this;
-        }
-    }
 }
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java
index 7d8d041..fa7ef47 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderTest.java
@@ -47,7 +47,6 @@
 import androidx.camera.core.CameraX;
 import androidx.camera.core.CaptureProcessor;
 import androidx.camera.core.ImageCapture;
-import androidx.camera.core.ImageCaptureConfig;
 import androidx.camera.core.LensFacing;
 import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.CaptureStageImpl;
@@ -113,13 +112,13 @@
 
         ImageCaptureExtender.ImageCaptureAdapter imageCaptureAdapter =
                 new ImageCaptureExtender.ImageCaptureAdapter(mockImageCaptureExtenderImpl, null);
-        ImageCaptureConfig.Builder configBuilder =
-                new ImageCaptureConfig.Builder().setCaptureBundle(
+        ImageCapture.Builder builder =
+                new ImageCapture.Builder().setCaptureBundle(
                         imageCaptureAdapter).setUseCaseEventCallback(
                         imageCaptureAdapter).setCaptureProcessor(
                         mock(CaptureProcessor.class));
 
-        ImageCapture useCase = configBuilder.build();
+        ImageCapture useCase = builder.build();
 
         LensFacing lensFacing = CameraX.getDefaultLensFacing();
         CameraSelector cameraSelector = new CameraSelector.Builder()
@@ -169,11 +168,10 @@
 
         ImageCaptureExtender.ImageCaptureAdapter imageCaptureAdapter =
                 new ImageCaptureExtender.ImageCaptureAdapter(mockImageCaptureExtenderImpl, null);
-        ImageCaptureConfig.Builder configBuilder =
-                new ImageCaptureConfig.Builder().setCaptureBundle(
-                        imageCaptureAdapter).setUseCaseEventCallback(
-                        imageCaptureAdapter).setCaptureProcessor(
-                        mock(CaptureProcessor.class));
+        ImageCapture.Builder configBuilder = new ImageCapture.Builder().setCaptureBundle(
+                imageCaptureAdapter).setUseCaseEventCallback(
+                imageCaptureAdapter).setCaptureProcessor(
+                mock(CaptureProcessor.class));
         new Camera2Config.Extender(configBuilder).setCameraEventCallback(
                 new CameraEventCallbacks(imageCaptureAdapter));
 
@@ -228,7 +226,7 @@
         assumeTrue(ExtensionVersion.getRuntimeVersion().compareTo(Version.VERSION_1_1) >= 0);
 
         LensFacing lensFacing = CameraX.getDefaultLensFacing();
-        ImageCaptureConfig.Builder configBuilder = new ImageCaptureConfig.Builder();
+        ImageCapture.Builder builder = new ImageCapture.Builder();
 
         ImageCaptureExtenderImpl mockImageCaptureExtenderImpl = mock(
                 ImageCaptureExtenderImpl.class);
@@ -238,18 +236,18 @@
         when(mockImageCaptureExtenderImpl.getSupportedResolutions()).thenReturn(
                 targetFormatResolutionsPairList);
 
-        ImageCaptureExtender fakeExtender = new FakeImageCaptureExtender(configBuilder,
+        ImageCaptureExtender fakeExtender = new FakeImageCaptureExtender(builder,
                 mockImageCaptureExtenderImpl);
 
         // Checks the config does not include supported resolutions before applying effect mode.
-        assertThat(configBuilder.getUseCaseConfig().getSupportedResolutions(null)).isNull();
+        assertThat(builder.getUseCaseConfig().getSupportedResolutions(null)).isNull();
 
         // Checks the config includes supported resolutions after applying effect mode.
         CameraSelector selector =
                 new CameraSelector.Builder().requireLensFacing(lensFacing).build();
         fakeExtender.enableExtension(selector);
         List<Pair<Integer, Size[]>> resultFormatResolutionsPairList =
-                configBuilder.getUseCaseConfig().getSupportedResolutions(null);
+                builder.getUseCaseConfig().getSupportedResolutions(null);
         assertThat(resultFormatResolutionsPairList).isNotNull();
 
         // Checks the result and target pair lists are the same
@@ -299,7 +297,7 @@
     }
 
     final class FakeImageCaptureExtender extends ImageCaptureExtender {
-        FakeImageCaptureExtender(ImageCaptureConfig.Builder builder,
+        FakeImageCaptureExtender(ImageCapture.Builder builder,
                 ImageCaptureExtenderImpl impl) {
             init(builder, impl, EffectMode.NORMAL);
         }
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
index fe3303d..685f85b 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
@@ -109,17 +109,17 @@
     }
 
     /**
-     * Creates an {@link ImageCaptureConfig.Builder} object for specific {@link EffectMode} and
+     * Creates an {@link ImageCapture.Builder} object for specific {@link EffectMode} and
      * {@link LensFacing}.
      *
      * @param effectMode The effect mode for the created object.
      * @param lensFacing The lens facing for the created object.
-     * @return An {@link ImageCaptureConfig.Builder} object.
+     * @return An {@link ImageCapture.Builder} object.
      */
     @NonNull
-    public static ImageCaptureConfig.Builder createImageCaptureConfigBuilderWithEffect(
+    public static ImageCapture.Builder createImageCaptureConfigBuilderWithEffect(
             @NonNull EffectMode effectMode, @NonNull LensFacing lensFacing) {
-        ImageCaptureConfig.Builder builder = new ImageCaptureConfig.Builder();
+        ImageCapture.Builder builder = new ImageCapture.Builder();
         CameraSelector selector =
                 new CameraSelector.Builder().requireLensFacing(lensFacing).build();
         ImageCaptureExtender extender = null;
@@ -209,7 +209,7 @@
     public static ImageCaptureConfig createImageCaptureConfigWithEffect(
             @NonNull EffectMode effectMode,
             @NonNull LensFacing lensFacing) {
-        ImageCaptureConfig.Builder imageCaptureConfigBuilder =
+        ImageCapture.Builder imageCaptureConfigBuilder =
                 createImageCaptureConfigBuilderWithEffect(effectMode, lensFacing);
         return imageCaptureConfigBuilder.getUseCaseConfig();
     }
@@ -241,9 +241,7 @@
     @NonNull
     public static ImageCapture createImageCaptureWithEffect(@NonNull EffectMode effectMode,
             @NonNull LensFacing lensFacing) {
-        ImageCaptureConfig imageCaptureConfig = createImageCaptureConfigWithEffect(effectMode,
-                lensFacing);
-        return new ImageCapture(imageCaptureConfig);
+        return createImageCaptureConfigBuilderWithEffect(effectMode, lensFacing).build();
     }
 
     /**
@@ -356,15 +354,15 @@
 
     /**
      * Creates an {@link ImageCaptureExtender} object for specific {@link EffectMode} and
-     * {@link ImageCaptureConfig.Builder}.
+     * {@link ImageCapture.Builder}.
      *
      * @param effectMode The effect mode for the created object.
-     * @param builder    The {@link ImageCaptureConfig.Builder} for the created object.
+     * @param builder    The {@link ImageCapture.Builder} for the created object.
      * @return An {@link ImageCaptureExtender} object.
      */
     @NonNull
     public static ImageCaptureExtender createImageCaptureExtender(@NonNull EffectMode effectMode,
-            @NonNull ImageCaptureConfig.Builder builder) {
+            @NonNull ImageCapture.Builder builder) {
         ImageCaptureExtender extender = null;
 
         switch (effectMode) {
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java
index 35ee05b..d20f956 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/AutoImageCaptureExtender.java
@@ -20,7 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.ImageCaptureConfig;
+import androidx.camera.core.ImageCapture;
 import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.AutoImageCaptureExtenderImpl;
 
@@ -36,7 +36,7 @@
      * @param builder Builder that will be used to create the configurations for the
      * {@link androidx.camera.core.ImageCapture}.
      */
-    public static AutoImageCaptureExtender create(ImageCaptureConfig.Builder builder) {
+    public static AutoImageCaptureExtender create(ImageCapture.Builder builder) {
         if (ExtensionVersion.isExtensionVersionSupported()) {
             try {
                 return new VendorAutoImageCaptureExtender(builder);
@@ -67,7 +67,7 @@
     static class VendorAutoImageCaptureExtender extends AutoImageCaptureExtender {
         private final AutoImageCaptureExtenderImpl mImpl;
 
-        VendorAutoImageCaptureExtender(ImageCaptureConfig.Builder builder) {
+        VendorAutoImageCaptureExtender(ImageCapture.Builder builder) {
             mImpl = new AutoImageCaptureExtenderImpl();
             init(builder, mImpl, EffectMode.AUTO);
         }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java
index 8875fef..1b6f321 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BeautyImageCaptureExtender.java
@@ -20,7 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.ImageCaptureConfig;
+import androidx.camera.core.ImageCapture;
 import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.BeautyImageCaptureExtenderImpl;
 
@@ -36,7 +36,7 @@
      * @param builder Builder that will be used to create the configurations for the
      * {@link androidx.camera.core.ImageCapture}.
      */
-    public static BeautyImageCaptureExtender create(ImageCaptureConfig.Builder builder) {
+    public static BeautyImageCaptureExtender create(ImageCapture.Builder builder) {
         if (ExtensionVersion.isExtensionVersionSupported()) {
             try {
                 return new VendorBeautyImageCaptureExtender(builder);
@@ -67,7 +67,7 @@
     static class VendorBeautyImageCaptureExtender extends BeautyImageCaptureExtender {
         private final BeautyImageCaptureExtenderImpl mImpl;
 
-        VendorBeautyImageCaptureExtender(ImageCaptureConfig.Builder builder) {
+        VendorBeautyImageCaptureExtender(ImageCapture.Builder builder) {
             mImpl = new BeautyImageCaptureExtenderImpl();
             init(builder, mImpl, EffectMode.BEAUTY);
         }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java
index 6f2e43f..a2dfa0f 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/BokehImageCaptureExtender.java
@@ -20,7 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.ImageCaptureConfig;
+import androidx.camera.core.ImageCapture;
 import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.BokehImageCaptureExtenderImpl;
 
@@ -36,7 +36,7 @@
      * @param builder Builder that will be used to create the configurations for the
      * {@link androidx.camera.core.ImageCapture}.
      */
-    public static BokehImageCaptureExtender create(ImageCaptureConfig.Builder builder) {
+    public static BokehImageCaptureExtender create(ImageCapture.Builder builder) {
         if (ExtensionVersion.isExtensionVersionSupported()) {
             try {
                 return new VendorBokehImageCaptureExtender(builder);
@@ -67,7 +67,7 @@
     private static class VendorBokehImageCaptureExtender extends BokehImageCaptureExtender {
         private final BokehImageCaptureExtenderImpl mImpl;
 
-        VendorBokehImageCaptureExtender(ImageCaptureConfig.Builder builder) {
+        VendorBokehImageCaptureExtender(ImageCapture.Builder builder) {
             mImpl = new BokehImageCaptureExtenderImpl();
             init(builder, mImpl, EffectMode.BOKEH);
         }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java
index e8be743..bd347f0 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java
@@ -25,7 +25,6 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.CameraX;
 import androidx.camera.core.ImageCapture;
-import androidx.camera.core.ImageCaptureConfig;
 import androidx.camera.core.LensFacing;
 import androidx.camera.core.Preview;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
@@ -187,7 +186,7 @@
 
     private static boolean checkImageCaptureExtensionCapability(EffectMode effectMode,
             LensFacing lensFacing) {
-        ImageCaptureConfig.Builder builder = new ImageCaptureConfig.Builder();
+        ImageCapture.Builder builder = new ImageCapture.Builder();
         CameraSelector selector =
                 new CameraSelector.Builder().requireLensFacing(lensFacing).build();
         ImageCaptureExtender extender;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java
index e81e3d3..ba0c681 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/HdrImageCaptureExtender.java
@@ -20,7 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.ImageCaptureConfig;
+import androidx.camera.core.ImageCapture;
 import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.HdrImageCaptureExtenderImpl;
 /**
@@ -35,7 +35,7 @@
      * @param builder Builder that will be used to create the configurations for the
      * {@link androidx.camera.core.ImageCapture}.
      */
-    public static HdrImageCaptureExtender create(ImageCaptureConfig.Builder builder) {
+    public static HdrImageCaptureExtender create(ImageCapture.Builder builder) {
         if (ExtensionVersion.isExtensionVersionSupported()) {
             try {
                 return new VendorHdrImageCaptureExtender(builder);
@@ -66,7 +66,7 @@
     static class VendorHdrImageCaptureExtender extends HdrImageCaptureExtender {
         private final HdrImageCaptureExtenderImpl mImpl;
 
-        VendorHdrImageCaptureExtender(ImageCaptureConfig.Builder builder) {
+        VendorHdrImageCaptureExtender(ImageCapture.Builder builder) {
             mImpl = new HdrImageCaptureExtenderImpl();
             init(builder, mImpl, EffectMode.HDR);
         }
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java
index 4c9bc4c3..cd67da9 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ImageCaptureExtender.java
@@ -36,7 +36,7 @@
 import androidx.camera.core.CaptureConfig;
 import androidx.camera.core.CaptureStage;
 import androidx.camera.core.Config;
-import androidx.camera.core.ImageCaptureConfig;
+import androidx.camera.core.ImageCapture;
 import androidx.camera.core.LensFacing;
 import androidx.camera.core.UseCase;
 import androidx.camera.core.impl.utils.CameraSelectorUtil;
@@ -60,11 +60,11 @@
     static final Config.Option<EffectMode> OPTION_IMAGE_CAPTURE_EXTENDER_MODE =
             Config.Option.create("camerax.extensions.imageCaptureExtender.mode", EffectMode.class);
 
-    private ImageCaptureConfig.Builder mBuilder;
+    private ImageCapture.Builder mBuilder;
     private ImageCaptureExtenderImpl mImpl;
     private EffectMode mEffectMode;
 
-    void init(ImageCaptureConfig.Builder builder, ImageCaptureExtenderImpl implementation,
+    void init(ImageCapture.Builder builder, ImageCaptureExtenderImpl implementation,
             EffectMode effectMode) {
         mBuilder = builder;
         mImpl = implementation;
@@ -72,7 +72,7 @@
     }
 
     /**
-     * Indicates whether extension function can support with {@link ImageCaptureConfig.Builder}
+     * Indicates whether extension function can support with {@link ImageCapture.Builder}
      *
      * @param cameraSelector The selector that determines a camera that will be checked for the
      *                       availability of extensions.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java
index 072edde..3f0d41e 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/NightImageCaptureExtender.java
@@ -20,7 +20,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.ImageCaptureConfig;
+import androidx.camera.core.ImageCapture;
 import androidx.camera.extensions.ExtensionsManager.EffectMode;
 import androidx.camera.extensions.impl.NightImageCaptureExtenderImpl;
 
@@ -36,7 +36,7 @@
      * @param builder Builder that will be used to create the configurations for the
      * {@link androidx.camera.core.ImageCapture}.
      */
-    public static NightImageCaptureExtender create(ImageCaptureConfig.Builder builder) {
+    public static NightImageCaptureExtender create(ImageCapture.Builder builder) {
         if (ExtensionVersion.isExtensionVersionSupported()) {
             try {
                 return new VendorNightImageCaptureExtender(builder);
@@ -67,7 +67,7 @@
     static class VendorNightImageCaptureExtender extends NightImageCaptureExtender {
         private final NightImageCaptureExtenderImpl mImpl;
 
-        VendorNightImageCaptureExtender(ImageCaptureConfig.Builder builder) {
+        VendorNightImageCaptureExtender(ImageCapture.Builder builder) {
             mImpl = new NightImageCaptureExtenderImpl();
             init(builder, mImpl, EffectMode.NIGHT);
         }
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/CameraXModule.java b/camera/camera-view/src/main/java/androidx/camera/view/CameraXModule.java
index b097500..240661d 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/CameraXModule.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/CameraXModule.java
@@ -40,7 +40,6 @@
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.ImageCapture.OnImageCapturedCallback;
 import androidx.camera.core.ImageCapture.OnImageSavedCallback;
-import androidx.camera.core.ImageCaptureConfig;
 import androidx.camera.core.LensFacing;
 import androidx.camera.core.Preview;
 import androidx.camera.core.VideoCapture;
@@ -79,7 +78,7 @@
 
     private final Preview.Builder mPreviewBuilder;
     private final VideoCaptureConfig.Builder mVideoCaptureConfigBuilder;
-    private final ImageCaptureConfig.Builder mImageCaptureConfigBuilder;
+    private final ImageCapture.Builder mImageCaptureBuilder;
     private final CameraView mCameraView;
     final AtomicBoolean mVideoIsRecording = new AtomicBoolean(false);
     private CameraView.CaptureMode mCaptureMode = CaptureMode.IMAGE;
@@ -121,8 +120,7 @@
 
         mPreviewBuilder = new Preview.Builder().setTargetName("Preview");
 
-        mImageCaptureConfigBuilder =
-                new ImageCaptureConfig.Builder().setTargetName("ImageCapture");
+        mImageCaptureBuilder = new ImageCapture.Builder().setTargetName("ImageCapture");
 
         mVideoCaptureConfigBuilder =
                 new VideoCaptureConfig.Builder().setTargetName("VideoCapture");
@@ -190,15 +188,15 @@
 
         Rational targetAspectRatio;
         if (getCaptureMode() == CaptureMode.IMAGE) {
-            mImageCaptureConfigBuilder.setTargetAspectRatio(AspectRatio.RATIO_4_3);
+            mImageCaptureBuilder.setTargetAspectRatio(AspectRatio.RATIO_4_3);
             targetAspectRatio = isDisplayPortrait ? ASPECT_RATIO_3_4 : ASPECT_RATIO_4_3;
         } else {
-            mImageCaptureConfigBuilder.setTargetAspectRatio(AspectRatio.RATIO_16_9);
+            mImageCaptureBuilder.setTargetAspectRatio(AspectRatio.RATIO_16_9);
             targetAspectRatio = isDisplayPortrait ? ASPECT_RATIO_9_16 : ASPECT_RATIO_16_9;
         }
 
-        mImageCaptureConfigBuilder.setTargetRotation(getDisplaySurfaceRotation());
-        mImageCapture = mImageCaptureConfigBuilder.build();
+        mImageCaptureBuilder.setTargetRotation(getDisplaySurfaceRotation());
+        mImageCapture = mImageCaptureBuilder.build();
 
         mVideoCaptureConfigBuilder.setTargetRotation(getDisplaySurfaceRotation());
         mVideoCapture = mVideoCaptureConfigBuilder.build();
diff --git a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
index 1673a4c..e533fd6 100644
--- a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
+++ b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
@@ -47,7 +47,6 @@
 import androidx.camera.core.ImageAnalysis;
 import androidx.camera.core.ImageAnalysisConfig;
 import androidx.camera.core.ImageCapture;
-import androidx.camera.core.ImageCaptureConfig;
 import androidx.camera.core.LensFacing;
 import androidx.camera.core.Preview;
 import androidx.camera.core.UseCase;
@@ -415,7 +414,7 @@
     }
 
     void enableImageCapture() {
-        mImageCapture = new ImageCaptureConfig.Builder()
+        mImageCapture = new ImageCapture.Builder()
                 .setCaptureMode(mCaptureMode)
                 .setTargetName("ImageCapture")
                 .build();
diff --git a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewProcessorTimestampTest.java b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewProcessorTimestampTest.java
index dbc9f23..5d8b10a 100644
--- a/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewProcessorTimestampTest.java
+++ b/camera/integration-tests/extensionstestapp/src/androidTest/java/androidx/camera/integration/extensions/PreviewProcessorTimestampTest.java
@@ -42,7 +42,6 @@
 import androidx.camera.core.CaptureProcessor;
 import androidx.camera.core.ImageAnalysisConfig;
 import androidx.camera.core.ImageCapture;
-import androidx.camera.core.ImageCaptureConfig;
 import androidx.camera.core.LensFacing;
 import androidx.camera.core.Preview;
 import androidx.camera.core.PreviewConfig;
@@ -108,7 +107,7 @@
     TimestampCaptureProcessor.TimestampListener mTimestampListener;
     SurfaceTexture.OnFrameAvailableListener mOnFrameAvailableListener;
 
-    private ImageCaptureConfig.Builder mImageCaptureConfigBuilder;
+    private ImageCapture.Builder mImageCaptureBuilder;
     private Preview.Builder mPreviewBuilder;
     private ImageAnalysisConfig.Builder mImageAnalysisConfigBuilder;
 
@@ -146,7 +145,7 @@
 
         mLifecycleOwner = new FakeLifecycleOwner();
 
-        mImageCaptureConfigBuilder = new ImageCaptureConfig.Builder();
+        mImageCaptureBuilder = new ImageCapture.Builder();
         mPreviewBuilder = new Preview.Builder();
         mImageAnalysisConfigBuilder = new ImageAnalysisConfig.Builder();
         mCameraStatusCallback = new CameraDevice.StateCallback() {
@@ -212,7 +211,7 @@
 
         mSurfaceTextureLatch = new CountDownLatch(1);
 
-        new Camera2Config.Extender(mImageCaptureConfigBuilder).setDeviceStateCallback(
+        new Camera2Config.Extender(mImageCaptureBuilder).setDeviceStateCallback(
                 mCameraStatusCallback);
     }
 
@@ -237,7 +236,7 @@
         enableExtension(mEffectMode, mLensFacing);
 
         // To test bind/unbind and take picture.
-        ImageCapture imageCapture = mImageCaptureConfigBuilder.build();
+        ImageCapture imageCapture = mImageCaptureBuilder.build();
 
         PreviewConfig previewConfig = mPreviewBuilder.getUseCaseConfig();
         CaptureProcessor previewCaptureProcessor = previewConfig.getCaptureProcessor(null);
@@ -294,25 +293,23 @@
 
         switch (effectMode) {
             case HDR:
-                imageCaptureExtender = HdrImageCaptureExtender.create(mImageCaptureConfigBuilder);
+                imageCaptureExtender = HdrImageCaptureExtender.create(mImageCaptureBuilder);
                 previewExtender = HdrPreviewExtender.create(mPreviewBuilder);
                 break;
             case BOKEH:
-                imageCaptureExtender = BokehImageCaptureExtender.create(
-                        mImageCaptureConfigBuilder);
+                imageCaptureExtender = BokehImageCaptureExtender.create(mImageCaptureBuilder);
                 previewExtender = BokehPreviewExtender.create(mPreviewBuilder);
                 break;
             case BEAUTY:
-                imageCaptureExtender = BeautyImageCaptureExtender.create(
-                        mImageCaptureConfigBuilder);
+                imageCaptureExtender = BeautyImageCaptureExtender.create(mImageCaptureBuilder);
                 previewExtender = BeautyPreviewExtender.create(mPreviewBuilder);
                 break;
             case NIGHT:
-                imageCaptureExtender = NightImageCaptureExtender.create(mImageCaptureConfigBuilder);
+                imageCaptureExtender = NightImageCaptureExtender.create(mImageCaptureBuilder);
                 previewExtender = NightPreviewExtender.create(mPreviewBuilder);
                 break;
             case AUTO:
-                imageCaptureExtender = AutoImageCaptureExtender.create(mImageCaptureConfigBuilder);
+                imageCaptureExtender = AutoImageCaptureExtender.create(mImageCaptureBuilder);
                 previewExtender = AutoPreviewExtender.create(mPreviewBuilder);
                 break;
         }
diff --git a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
index 22e2470..5b5f487 100644
--- a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
+++ b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
@@ -41,7 +41,6 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.CameraX;
 import androidx.camera.core.ImageCapture;
-import androidx.camera.core.ImageCaptureConfig;
 import androidx.camera.core.LensFacing;
 import androidx.camera.core.Preview;
 import androidx.camera.core.PreviewSurfaceProviders;
@@ -251,9 +250,7 @@
 
     void enableImageCapture(ImageCaptureType imageCaptureType) {
         mCurrentImageCaptureType = imageCaptureType;
-        ImageCaptureConfig.Builder builder =
-                new ImageCaptureConfig.Builder()
-                        .setTargetName("ImageCapture");
+        ImageCapture.Builder builder = new ImageCapture.Builder().setTargetName("ImageCapture");
         Button toggleButton = findViewById(R.id.PhotoToggle);
         toggleButton.setText(mCurrentImageCaptureType.toString());
 
diff --git a/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/CameraParams.kt b/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/CameraParams.kt
index 2e6c59d..e8cf6c8 100644
--- a/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/CameraParams.kt
+++ b/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/CameraParams.kt
@@ -25,7 +25,6 @@
 import android.os.HandlerThread
 import android.util.Size
 import androidx.camera.core.ImageCapture
-import androidx.camera.core.ImageCaptureConfig
 import androidx.camera.core.Preview
 import androidx.camera.integration.antelope.MainActivity.Companion.FIXED_FOCUS_DISTANCE
 import androidx.camera.integration.antelope.MainActivity.Companion.INVALID_FOCAL_LENGTH
@@ -105,11 +104,11 @@
     internal var cameraXPreviewSessionStateCallback: CameraXPreviewSessionStateCallback? = null
     internal var cameraXCaptureSessionCallback: CameraXCaptureSessionCallback? = null
     internal var cameraXPreviewBuilder: Preview.Builder = Preview.Builder()
-    internal var cameraXCaptureBuilder: ImageCaptureConfig.Builder = ImageCaptureConfig.Builder()
+    internal var cameraXCaptureBuilder: ImageCapture.Builder = ImageCapture.Builder()
 
     // Custom lifecycle for CameraX API
     internal var cameraXLifecycle: CustomLifecycle = CustomLifecycle()
-    internal var cameraXImageCaptureUseCase: ImageCapture = ImageCaptureConfig.Builder().build()
+    internal var cameraXImageCaptureUseCase: ImageCapture = ImageCapture.Builder().build()
 
     // Testing variables
     internal var timer: CameraTimer = CameraTimer()
diff --git a/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/CameraUtils.kt b/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/CameraUtils.kt
index ab919f2..0b73ead 100644
--- a/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/CameraUtils.kt
+++ b/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/CameraUtils.kt
@@ -29,7 +29,7 @@
 import android.util.SparseIntArray
 import android.view.Surface
 import androidx.appcompat.app.AppCompatActivity
-import androidx.camera.core.ImageCaptureConfig
+import androidx.camera.core.ImageCapture
 import androidx.camera.core.Preview
 import androidx.camera.integration.antelope.MainActivity.Companion.FIXED_FOCUS_DISTANCE
 import androidx.camera.integration.antelope.MainActivity.Companion.cameraParams
@@ -167,7 +167,7 @@
 
                 cameraXPreviewBuilder = Preview.Builder()
 
-                cameraXCaptureBuilder = ImageCaptureConfig.Builder()
+                cameraXCaptureBuilder = ImageCapture.Builder()
 
                 imageAvailableListener =
                     ImageAvailableListener(activity, this, TestConfig())
diff --git a/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/cameracontrollers/CameraXController.kt b/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/cameracontrollers/CameraXController.kt
index 705ce10..8582c6a 100644
--- a/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/cameracontrollers/CameraXController.kt
+++ b/camera/integration-tests/timingtestapp/src/main/java/androidx/camera/integration/antelope/cameracontrollers/CameraXController.kt
@@ -27,7 +27,6 @@
 import androidx.camera.camera2.ExperimentalCamera2Interop
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.ImageCapture
-import androidx.camera.core.ImageCaptureConfig
 import androidx.camera.core.LensFacing
 import androidx.camera.core.Preview
 import androidx.camera.core.PreviewSurfaceProviders
@@ -315,9 +314,9 @@
     deviceStateCallback:
     CameraDevice.StateCallback,
     sessionCaptureCallback: CameraCaptureSession.CaptureCallback
-): ImageCaptureConfig.Builder {
+): ImageCapture.Builder {
 
-    val configBuilder = ImageCaptureConfig.Builder()
+    val configBuilder = ImageCapture.Builder()
         .setCaptureMode(ImageCapture.CaptureMode.MAX_QUALITY)
     Camera2Config.Extender(configBuilder)
         .setDeviceStateCallback(deviceStateCallback)