Remove java 8 features.

* Remove java 8 interface default method.
  - put Configuration.Reader/Builder implementation in implementation class.
  - Remove default methods in CamraControl / CameraInfo /
* add final to variable used in inner class
* Replace DefaultLifeclcyeObserver(java 8 only) with LifecyclerObserver with annotations.

Bug: 124267925
Test: manual
Change-Id: I0dbe2032e00fa82380bf7d0d254445aae266254d
diff --git a/camera/camera2/src/main/java/androidx/camera/camera2/Camera.java b/camera/camera2/src/main/java/androidx/camera/camera2/Camera.java
index 451028b..1f24bc0 100644
--- a/camera/camera2/src/main/java/androidx/camera/camera2/Camera.java
+++ b/camera/camera2/src/main/java/androidx/camera/camera2/Camera.java
@@ -217,7 +217,7 @@
      * <p>The use case must also be online in order for it to issue capture requests.
      */
     @Override
-    public void onUseCaseActive(BaseUseCase useCase) {
+    public void onUseCaseActive(final BaseUseCase useCase) {
         if (Looper.myLooper() != mHandler.getLooper()) {
             mHandler.post(new Runnable() {
                 @Override
@@ -238,7 +238,7 @@
 
     /** Removes the use case from a state of issuing capture requests. */
     @Override
-    public void onUseCaseInactive(BaseUseCase useCase) {
+    public void onUseCaseInactive(final BaseUseCase useCase) {
         if (Looper.myLooper() != mHandler.getLooper()) {
             mHandler.post(new Runnable() {
                 @Override
@@ -259,7 +259,7 @@
 
     /** Updates the capture requests based on the latest settings. */
     @Override
-    public void onUseCaseUpdated(BaseUseCase useCase) {
+    public void onUseCaseUpdated(final BaseUseCase useCase) {
         if (Looper.myLooper() != mHandler.getLooper()) {
             mHandler.post(new Runnable() {
                 @Override
@@ -279,7 +279,7 @@
     }
 
     @Override
-    public void onUseCaseReset(BaseUseCase useCase) {
+    public void onUseCaseReset(final BaseUseCase useCase) {
         if (Looper.myLooper() != mHandler.getLooper()) {
             mHandler.post(new Runnable() {
                 @Override
@@ -310,7 +310,7 @@
      * capture requests from the use case.
      */
     @Override
-    public void addOnlineUseCase(Collection<BaseUseCase> useCases) {
+    public void addOnlineUseCase(final Collection<BaseUseCase> useCases) {
         if (useCases.isEmpty()) {
             return;
         }
@@ -342,7 +342,7 @@
      * handle capture requests from the use case.
      */
     @Override
-    public void removeOnlineUseCase(Collection<BaseUseCase> useCases) {
+    public void removeOnlineUseCase(final Collection<BaseUseCase> useCases) {
         if (useCases.isEmpty()) {
             return;
         }
@@ -531,7 +531,7 @@
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
     @Override
-    public void submitSingleRequest(CaptureRequestConfiguration captureRequestConfiguration) {
+    public void submitSingleRequest(final CaptureRequestConfiguration captureRequestConfiguration) {
         if (Looper.myLooper() != mHandler.getLooper()) {
             mHandler.post(new Runnable() {
                 @Override
diff --git a/camera/camera2/src/main/java/androidx/camera/camera2/Camera2CameraControl.java b/camera/camera2/src/main/java/androidx/camera/camera2/Camera2CameraControl.java
index 639999b..2001880 100644
--- a/camera/camera2/src/main/java/androidx/camera/camera2/Camera2CameraControl.java
+++ b/camera/camera2/src/main/java/androidx/camera/camera2/Camera2CameraControl.java
@@ -99,7 +99,7 @@
 
     /** {@inheritDoc} */
     @Override
-    public void setCropRegion(Rect crop) {
+    public void setCropRegion(final Rect crop) {
         if (Looper.myLooper() != mHandler.getLooper()) {
             mHandler.post(new Runnable() {
                 @Override
@@ -117,10 +117,10 @@
     /** {@inheritDoc} */
     @Override
     public void focus(
-            Rect focus,
-            Rect metering,
-            @Nullable OnFocusCompletedListener listener,
-            @Nullable Handler listenerHandler) {
+            final Rect focus,
+            final Rect metering,
+            @Nullable final OnFocusCompletedListener listener,
+            @Nullable final Handler listenerHandler) {
         if (Looper.myLooper() != mHandler.getLooper()) {
             mHandler.post(new Runnable() {
                 @Override
@@ -199,6 +199,11 @@
         }
     }
 
+    @Override
+    public void focus(Rect focus, Rect metering) {
+        focus(focus, metering, null, null);
+    }
+
     private void runInFocusListenerHandler(Runnable runnable) {
         if (mFocusListenerHandler != null) {
             mFocusListenerHandler.post(runnable);
@@ -275,7 +280,7 @@
         enableTorchInternal(torch);
     }
 
-    private void enableTorchInternal(boolean torch) {
+    private void enableTorchInternal(final boolean torch) {
         if (Looper.myLooper() != mHandler.getLooper()) {
             mHandler.post(new Runnable() {
                 @Override
@@ -365,7 +370,8 @@
      * exposure scan.
      */
     @Override
-    public void cancelAfAeTrigger(boolean cancelAfTrigger, boolean cancelAePrecaptureTrigger) {
+    public void cancelAfAeTrigger(final boolean cancelAfTrigger,
+            final boolean cancelAePrecaptureTrigger) {
         if (Looper.myLooper() != mHandler.getLooper()) {
             mHandler.post(new Runnable() {
                 @Override
diff --git a/camera/camera2/src/main/java/androidx/camera/camera2/Camera2CameraInfo.java b/camera/camera2/src/main/java/androidx/camera/camera2/Camera2CameraInfo.java
index 69d69b8..06ba9e7 100644
--- a/camera/camera2/src/main/java/androidx/camera/camera2/Camera2CameraInfo.java
+++ b/camera/camera2/src/main/java/androidx/camera/camera2/Camera2CameraInfo.java
@@ -20,6 +20,7 @@
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraManager;
+import android.view.Surface;
 
 import androidx.annotation.Nullable;
 import androidx.camera.core.CameraInfo;
@@ -90,4 +91,9 @@
                             + readableName);
         }
     }
+
+    @Override
+    public int getSensorRotationDegrees() {
+        return getSensorRotationDegrees(Surface.ROTATION_0);
+    }
 }
diff --git a/camera/camera2/src/main/java/androidx/camera/camera2/Camera2Configuration.java b/camera/camera2/src/main/java/androidx/camera/camera2/Camera2Configuration.java
index 38adfae9..c2270855 100644
--- a/camera/camera2/src/main/java/androidx/camera/camera2/Camera2Configuration.java
+++ b/camera/camera2/src/main/java/androidx/camera/camera2/Camera2Configuration.java
@@ -87,7 +87,7 @@
 
     /** Returns all capture request options contained in this configuration. */
     Set<Option<?>> getCaptureRequestOptions() {
-        Set<Option<?>> optionSet = new HashSet<>();
+        final Set<Option<?>> optionSet = new HashSet<>();
         findOptions(
                 Camera2Configuration.CAPTURE_REQUEST_ID_STEM,
                 new OptionMatcher() {
@@ -316,5 +316,75 @@
         public Camera2Configuration build() {
             return new Camera2Configuration(OptionsBundle.from(mMutableOptionsBundle));
         }
+
+        // Start of the default implementation of Configuration.Builder
+        // *****************************************************************************************
+
+        // Implementations of Configuration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public <ValueT> Builder insertOption(Option<ValueT> opt, ValueT value) {
+            getMutableConfiguration().insertOption(opt, value);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @Nullable
+        public <ValueT> Builder removeOption(Option<ValueT> opt) {
+            getMutableConfiguration().removeOption(opt);
+            return builder();
+        }
+
+        // End of the default implementation of Configuration.Builder
+        // *****************************************************************************************
     }
+
+    // Start of the default implementation of Configuration
+    // *********************************************************************************************
+
+    // Implementations of Configuration.Reader default methods
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public boolean containsOption(Option<?> id) {
+        return getConfiguration().containsOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id) {
+        return getConfiguration().retrieveOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id, @Nullable ValueT valueIfMissing) {
+        return getConfiguration().retrieveOption(id, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public void findOptions(String idStem, OptionMatcher matcher) {
+        getConfiguration().findOptions(idStem, matcher);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Set<Option<?>> listOptions() {
+        return getConfiguration().listOptions();
+    }
+
+    // End of the default implementation of Configuration
+    // *********************************************************************************************
 }
diff --git a/camera/camera2/src/main/java/androidx/camera/camera2/Camera2DeviceSurfaceManager.java b/camera/camera2/src/main/java/androidx/camera/camera2/Camera2DeviceSurfaceManager.java
index 61add18..e4827e7 100644
--- a/camera/camera2/src/main/java/androidx/camera/camera2/Camera2DeviceSurfaceManager.java
+++ b/camera/camera2/src/main/java/androidx/camera/camera2/Camera2DeviceSurfaceManager.java
@@ -52,7 +52,12 @@
     private boolean mIsInitialized = false;
 
     Camera2DeviceSurfaceManager(Context context) {
-        init(context, CamcorderProfile::hasProfile);
+        init(context, new CamcorderProfileHelper() {
+            @Override
+            public boolean hasProfile(int cameraId, int quality) {
+                return CamcorderProfile.hasProfile(cameraId, quality);
+            }
+        });
     }
 
     @VisibleForTesting
diff --git a/camera/camera2/src/main/java/androidx/camera/camera2/Camera2OptionUnpacker.java b/camera/camera2/src/main/java/androidx/camera/camera2/Camera2OptionUnpacker.java
index 4836a5b..33e77b7 100644
--- a/camera/camera2/src/main/java/androidx/camera/camera2/Camera2OptionUnpacker.java
+++ b/camera/camera2/src/main/java/androidx/camera/camera2/Camera2OptionUnpacker.java
@@ -39,7 +39,7 @@
     static final Camera2OptionUnpacker INSTANCE = new Camera2OptionUnpacker();
 
     @Override
-    public void unpack(UseCaseConfiguration<?> config, SessionConfiguration.Builder builder) {
+    public void unpack(UseCaseConfiguration<?> config, final SessionConfiguration.Builder builder) {
         SessionConfiguration defaultSessionConfig =
                 config.getDefaultSessionConfiguration(/*valueIfMissing=*/ null);
 
@@ -68,7 +68,7 @@
         builder.setImplementationOptions(implOptions);
 
         // Get Camera2 extended options
-        Camera2Configuration camera2Config = new Camera2Configuration(config);
+        final Camera2Configuration camera2Config = new Camera2Configuration(config);
 
         // Apply template type
         builder.setTemplateType(camera2Config.getCaptureRequestTemplate(templateType));
diff --git a/camera/core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java b/camera/core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java
index d039d71..c0930b7 100644
--- a/camera/core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java
+++ b/camera/core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java
@@ -60,8 +60,8 @@
     @Test
     public void close_notifiesOnImageCloseListener_afterSetOnImageCloseListener()
             throws InterruptedException {
-        Semaphore closedImageSemaphore = new Semaphore(/*permits=*/ 0);
-        AtomicReference<ImageProxy> closedImage = new AtomicReference<>();
+        final Semaphore closedImageSemaphore = new Semaphore(/*permits=*/ 0);
+        final AtomicReference<ImageProxy> closedImage = new AtomicReference<>();
         mImageProxy.addOnImageCloseListener(
                 new ForwardingImageProxy.OnImageCloseListener() {
                     @Override
diff --git a/camera/core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java b/camera/core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java
index 18d6b14..2a304e0 100644
--- a/camera/core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java
+++ b/camera/core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java
@@ -96,7 +96,7 @@
 
     @Override
     public synchronized void setOnImageAvailableListener(
-            @Nullable ImageReaderProxy.OnImageAvailableListener listener,
+            @Nullable final ImageReaderProxy.OnImageAvailableListener listener,
             @Nullable Handler handler) {
         ImageReader.OnImageAvailableListener transformedListener =
                 new ImageReader.OnImageAvailableListener() {
diff --git a/camera/core/src/main/java/androidx/camera/core/AppConfiguration.java b/camera/core/src/main/java/androidx/camera/core/AppConfiguration.java
index 7e7682e..1d40315 100644
--- a/camera/core/src/main/java/androidx/camera/core/AppConfiguration.java
+++ b/camera/core/src/main/java/androidx/camera/core/AppConfiguration.java
@@ -20,6 +20,9 @@
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 
+import java.util.Set;
+import java.util.UUID;
+
 /**
  * Configuration for adding implementation and user-specific behavior to CameraX.
  *
@@ -176,5 +179,132 @@
         public AppConfiguration build() {
             return new AppConfiguration(OptionsBundle.from(mMutableConfig));
         }
+
+
+        // Start of the default implementation of Configuration.Builder
+        // *****************************************************************************************
+
+        // Implementations of Configuration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public <ValueT> Builder insertOption(Option<ValueT> opt, ValueT value) {
+            getMutableConfiguration().insertOption(opt, value);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @Nullable
+        public <ValueT> Builder removeOption(Option<ValueT> opt) {
+            getMutableConfiguration().removeOption(opt);
+            return builder();
+        }
+
+        // Implementations of TargetConfiguration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setTargetClass(Class<CameraX> targetClass) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_CLASS, targetClass);
+
+            // If no name is set yet, then generate a unique name
+            if (null == getMutableConfiguration().retrieveOption(OPTION_TARGET_NAME, null)) {
+                String targetName = targetClass.getCanonicalName() + "-" + UUID.randomUUID();
+                setTargetName(targetName);
+            }
+
+            return builder();
+        }
+
+        @Override
+        public Builder setTargetName(String targetName) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_NAME, targetName);
+            return builder();
+        }
+
+        // End of the default implementation of Configuration.Builder
+        // *****************************************************************************************
     }
+
+
+    // Start of the default implementation of Configuration
+    // *********************************************************************************************
+
+    // Implementations of Configuration.Reader default methods
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public boolean containsOption(Option<?> id) {
+        return getConfiguration().containsOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id) {
+        return getConfiguration().retrieveOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id, @Nullable ValueT valueIfMissing) {
+        return getConfiguration().retrieveOption(id, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public void findOptions(String idStem, OptionMatcher matcher) {
+        getConfiguration().findOptions(idStem, matcher);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Set<Option<?>> listOptions() {
+        return getConfiguration().listOptions();
+    }
+
+    // Implementations of TargetConfiguration default methods
+
+    @Override
+    @Nullable
+    public Class<CameraX> getTargetClass(
+            @Nullable Class<CameraX> valueIfMissing) {
+        @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass()
+                Class<CameraX> storedClass = (Class<CameraX>) retrieveOption(
+                OPTION_TARGET_CLASS,
+                valueIfMissing);
+        return storedClass;
+    }
+
+    @Override
+    public Class<CameraX> getTargetClass() {
+        @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass()
+                Class<CameraX> storedClass = (Class<CameraX>) retrieveOption(
+                OPTION_TARGET_CLASS);
+        return storedClass;
+    }
+
+    @Override
+    @Nullable
+    public String getTargetName(@Nullable String valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_NAME, valueIfMissing);
+    }
+
+    @Override
+    public String getTargetName() {
+        return retrieveOption(OPTION_TARGET_NAME);
+    }
+
+    // End of the default implementation of Configuration
+    // *********************************************************************************************
 }
diff --git a/camera/core/src/main/java/androidx/camera/core/BaseCamera.java b/camera/core/src/main/java/androidx/camera/core/BaseCamera.java
index ffd84cd..d16224c 100644
--- a/camera/core/src/main/java/androidx/camera/core/BaseCamera.java
+++ b/camera/core/src/main/java/androidx/camera/core/BaseCamera.java
@@ -65,12 +65,8 @@
     void removeOnlineUseCase(Collection<BaseUseCase> baseUseCases);
 
     /** Returns the global CameraControl attached to this camera. */
-    default CameraControl getCameraControl() {
-        return CameraControl.defaultEmptyInstance();
-    }
+    CameraControl getCameraControl();
 
     /** Returns an interface to retrieve characteristics of the camera. */
-    default CameraInfo getCameraInfo() throws CameraInfoUnavailableException {
-        throw new CameraInfoUnavailableException("Camera info not implemented.");
-    }
+    CameraInfo getCameraInfo() throws CameraInfoUnavailableException;
 }
diff --git a/camera/core/src/main/java/androidx/camera/core/BaseUseCase.java b/camera/core/src/main/java/androidx/camera/core/BaseUseCase.java
index f69ac3a..f1f288b 100644
--- a/camera/core/src/main/java/androidx/camera/core/BaseUseCase.java
+++ b/camera/core/src/main/java/androidx/camera/core/BaseUseCase.java
@@ -411,7 +411,7 @@
     protected CameraControl getCameraControl(String cameraId) {
         CameraControl cameraControl = mAttachedCameraControlMap.get(cameraId);
         if (cameraControl == null) {
-            return CameraControl.defaultEmptyInstance();
+            return CameraControl.DEFAULT_EMPTY_INSTANCE;
         }
         return cameraControl;
     }
diff --git a/camera/core/src/main/java/androidx/camera/core/CameraControl.java b/camera/core/src/main/java/androidx/camera/core/CameraControl.java
index 5571e64..00314e1 100644
--- a/camera/core/src/main/java/androidx/camera/core/CameraControl.java
+++ b/camera/core/src/main/java/androidx/camera/core/CameraControl.java
@@ -38,69 +38,6 @@
  */
 @RestrictTo(Scope.LIBRARY_GROUP)
 public interface CameraControl {
-    /** Returns an instance of CameraControl that does nothing. */
-    static CameraControl defaultEmptyInstance() {
-        return new CameraControl() {
-            @Override
-            public void setCropRegion(Rect crop) {
-            }
-
-            @Override
-            public void focus(
-                    Rect focus,
-                    Rect metering,
-                    @Nullable OnFocusCompletedListener listener,
-                    @Nullable Handler handler) {
-            }
-
-            @Override
-            public FlashMode getFlashMode() {
-                return null;
-            }
-
-            @Override
-            public void setFlashMode(FlashMode flashMode) {
-            }
-
-            @Override
-            public void enableTorch(boolean torch) {
-            }
-
-            @Override
-            public boolean isTorchOn() {
-                return false;
-            }
-
-            @Override
-            public boolean isFocusLocked() {
-                return false;
-            }
-
-            @Override
-            public void triggerAf() {
-            }
-
-            @Override
-            public void triggerAePrecapture() {
-            }
-
-            @Override
-            public void cancelAfAeTrigger(
-                    boolean cancelAfTrigger, boolean cancelAePrecaptureTrigger) {
-            }
-
-            @Override
-            public SessionConfiguration getControlSessionConfiguration() {
-                return SessionConfiguration.defaultEmptySessionConfiguration();
-            }
-
-            @Override
-            public Configuration getSingleRequestImplOptions() {
-                return OptionsBundle.emptyBundle();
-            }
-        };
-    }
-
     /**
      * Set the desired crop region of the sensor to read out for all capture requests.
      *
@@ -138,9 +75,7 @@
      * @param focus    rectangle with dimensions in sensor coordinate frame for focus
      * @param metering rectangle with dimensions in sensor coordinate frame for metering
      */
-    default void focus(Rect focus, Rect metering) {
-        focus(focus, metering, null, null);
-    }
+    void focus(Rect focus, Rect metering);
 
     /** Returns the current flash mode. */
     FlashMode getFlashMode();
@@ -183,4 +118,65 @@
 
     /** Attaches the common request implementation options to every SINGLE requests. */
     Configuration getSingleRequestImplOptions();
+
+    CameraControl DEFAULT_EMPTY_INSTANCE = new CameraControl() {
+        @Override
+        public void setCropRegion(Rect crop) {
+        }
+
+        @Override
+        public void focus(Rect focus, Rect metering, @Nullable OnFocusCompletedListener listener,
+                @Nullable Handler handler) {
+        }
+
+        @Override
+        public void focus(Rect focus, Rect metering) {
+        }
+
+        @Override
+        public FlashMode getFlashMode() {
+            return null;
+        }
+
+        @Override
+        public void setFlashMode(FlashMode flashMode) {
+        }
+
+        @Override
+        public void enableTorch(boolean torch) {
+        }
+
+        @Override
+        public boolean isTorchOn() {
+            return false;
+        }
+
+        @Override
+        public boolean isFocusLocked() {
+            return false;
+        }
+
+        @Override
+        public void triggerAf() {
+        }
+
+        @Override
+        public void triggerAePrecapture() {
+        }
+
+        @Override
+        public void cancelAfAeTrigger(boolean cancelAfTrigger, boolean cancelAePrecaptureTrigger) {
+
+        }
+
+        @Override
+        public SessionConfiguration getControlSessionConfiguration() {
+            return SessionConfiguration.defaultEmptySessionConfiguration();
+        }
+
+        @Override
+        public Configuration getSingleRequestImplOptions() {
+            return OptionsBundle.emptyBundle();
+        }
+    };
 }
diff --git a/camera/core/src/main/java/androidx/camera/core/CameraDeviceConfiguration.java b/camera/core/src/main/java/androidx/camera/core/CameraDeviceConfiguration.java
index 819e3be..a009528 100644
--- a/camera/core/src/main/java/androidx/camera/core/CameraDeviceConfiguration.java
+++ b/camera/core/src/main/java/androidx/camera/core/CameraDeviceConfiguration.java
@@ -45,9 +45,7 @@
      * configuration.
      */
     @Nullable
-    default CameraX.LensFacing getLensFacing(@Nullable LensFacing valueIfMissing) {
-        return retrieveOption(OPTION_LENS_FACING, valueIfMissing);
-    }
+    CameraX.LensFacing getLensFacing(@Nullable LensFacing valueIfMissing);
 
     /**
      * Retrieves the lens facing direction for the primary camera to be configured.
@@ -55,9 +53,7 @@
      * @return The stored value, if it exists in this configuration.
      * @throws IllegalArgumentException if the option does not exist in this configuration.
      */
-    default CameraX.LensFacing getLensFacing() {
-        return retrieveOption(OPTION_LENS_FACING);
-    }
+    CameraX.LensFacing getLensFacing();
 
     // Option Declarations:
     // *********************************************************************************************
@@ -80,9 +76,6 @@
          * @param lensFacing The direction of the camera's lens.
          * @return the current Builder.
          */
-        default B setLensFacing(CameraX.LensFacing lensFacing) {
-            getMutableConfiguration().insertOption(OPTION_LENS_FACING, lensFacing);
-            return builder();
-        }
+        B setLensFacing(CameraX.LensFacing lensFacing);
     }
 }
diff --git a/camera/core/src/main/java/androidx/camera/core/CameraInfo.java b/camera/core/src/main/java/androidx/camera/core/CameraInfo.java
index f7f6a4d..ab4cf7b 100644
--- a/camera/core/src/main/java/androidx/camera/core/CameraInfo.java
+++ b/camera/core/src/main/java/androidx/camera/core/CameraInfo.java
@@ -51,9 +51,7 @@
      * @return The sensor orientation in degrees.
      * @see Surface#ROTATION_0, the natural orientation of the device.
      */
-    default int getSensorRotationDegrees() {
-        return getSensorRotationDegrees(Surface.ROTATION_0);
-    }
+    int getSensorRotationDegrees();
 
     /**
      * Returns the sensor rotation, in degrees, relative to the given rotation value.
diff --git a/camera/core/src/main/java/androidx/camera/core/CheckedSurfaceTexture.java b/camera/core/src/main/java/androidx/camera/core/CheckedSurfaceTexture.java
index 45697fa..4e8813b 100644
--- a/camera/core/src/main/java/androidx/camera/core/CheckedSurfaceTexture.java
+++ b/camera/core/src/main/java/androidx/camera/core/CheckedSurfaceTexture.java
@@ -117,7 +117,7 @@
      */
     @Override
     public ListenableFuture<Surface> getSurface() {
-        SettableFuture<Surface> deferredSurface = SettableFuture.create();
+        final SettableFuture<Surface> deferredSurface = SettableFuture.create();
         Runnable checkAndSetRunnable =
                 new Runnable() {
                     @Override
diff --git a/camera/core/src/main/java/androidx/camera/core/Configuration.java b/camera/core/src/main/java/androidx/camera/core/Configuration.java
index a17fe70..b75cb22 100644
--- a/camera/core/src/main/java/androidx/camera/core/Configuration.java
+++ b/camera/core/src/main/java/androidx/camera/core/Configuration.java
@@ -146,9 +146,7 @@
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
         @Override
-        default boolean containsOption(Option<?> id) {
-            return getConfiguration().containsOption(id);
-        }
+        boolean containsOption(Option<?> id);
 
         /**
          * {@inheritDoc}
@@ -158,9 +156,7 @@
         @RestrictTo(Scope.LIBRARY_GROUP)
         @Override
         @Nullable
-        default <ValueT> ValueT retrieveOption(Option<ValueT> id) {
-            return getConfiguration().retrieveOption(id);
-        }
+        <ValueT> ValueT retrieveOption(Option<ValueT> id);
 
         /**
          * {@inheritDoc}
@@ -170,9 +166,7 @@
         @RestrictTo(Scope.LIBRARY_GROUP)
         @Override
         @Nullable
-        default <ValueT> ValueT retrieveOption(Option<ValueT> id, @Nullable ValueT valueIfMissing) {
-            return getConfiguration().retrieveOption(id, valueIfMissing);
-        }
+        <ValueT> ValueT retrieveOption(Option<ValueT> id, @Nullable ValueT valueIfMissing);
 
         /**
          * {@inheritDoc}
@@ -181,9 +175,7 @@
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
         @Override
-        default void findOptions(String idStem, OptionMatcher matcher) {
-            getConfiguration().findOptions(idStem, matcher);
-        }
+        void findOptions(String idStem, OptionMatcher matcher);
 
         /**
          * {@inheritDoc}
@@ -192,9 +184,8 @@
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
         @Override
-        default Set<Option<?>> listOptions() {
-            return getConfiguration().listOptions();
-        }
+        Set<Option<?>> listOptions();
+
     }
 
     /**
@@ -233,10 +224,7 @@
          * @hide
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        default <ValueT> T insertOption(Option<ValueT> opt, ValueT value) {
-            getMutableConfiguration().insertOption(opt, value);
-            return builder();
-        }
+        <ValueT> T insertOption(Option<ValueT> opt, ValueT value);
 
         /**
          * Removes an option from the configuration if it exists.
@@ -249,10 +237,7 @@
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
         @Nullable
-        default <ValueT> T removeOption(Option<ValueT> opt) {
-            getMutableConfiguration().removeOption(opt);
-            return builder();
-        }
+        <ValueT> T removeOption(Option<ValueT> opt);
 
         /**
          * Creates an immutable {@link Configuration} object from the current state of this builder.
diff --git a/camera/core/src/main/java/androidx/camera/core/DeferrableSurfaces.java b/camera/core/src/main/java/androidx/camera/core/DeferrableSurfaces.java
index ae0d86d..2c48b1d 100644
--- a/camera/core/src/main/java/androidx/camera/core/DeferrableSurfaces.java
+++ b/camera/core/src/main/java/androidx/camera/core/DeferrableSurfaces.java
@@ -67,7 +67,7 @@
             surfaces.removeAll(Collections.singleton(null));
             return Collections.unmodifiableList(surfaces);
         } catch (InterruptedException | ExecutionException e) {
-            return Collections.unmodifiableList(Collections.emptyList());
+            return Collections.unmodifiableList(Collections.<Surface>emptyList());
         }
     }
 
@@ -91,7 +91,7 @@
             surfaces.removeAll(Collections.singleton(null));
             return Collections.unmodifiableSet(surfaces);
         } catch (InterruptedException | ExecutionException e) {
-            return Collections.unmodifiableSet(Collections.emptySet());
+            return Collections.unmodifiableSet(Collections.<Surface>emptySet());
         }
     }
 }
diff --git a/camera/core/src/main/java/androidx/camera/core/ErrorHandler.java b/camera/core/src/main/java/androidx/camera/core/ErrorHandler.java
index 5f25c6f..e4438fb 100644
--- a/camera/core/src/main/java/androidx/camera/core/ErrorHandler.java
+++ b/camera/core/src/main/java/androidx/camera/core/ErrorHandler.java
@@ -49,9 +49,9 @@
      * @param error   the type of error that occurred
      * @param message detailed message of the error condition
      */
-    void postError(ErrorCode error, String message) {
+    void postError(final ErrorCode error, final String message) {
         synchronized (mErrorLock) {
-            ErrorListener listenerReference = mListener;
+            final ErrorListener listenerReference = mListener;
             mHandler.post(new Runnable() {
                 @Override
                 public void run() {
diff --git a/camera/core/src/main/java/androidx/camera/core/ImageAnalysisUseCaseConfiguration.java b/camera/core/src/main/java/androidx/camera/core/ImageAnalysisUseCaseConfiguration.java
index bb64c26..58dd3eb9 100644
--- a/camera/core/src/main/java/androidx/camera/core/ImageAnalysisUseCaseConfiguration.java
+++ b/camera/core/src/main/java/androidx/camera/core/ImageAnalysisUseCaseConfiguration.java
@@ -17,6 +17,8 @@
 package androidx.camera.core;
 
 import android.media.ImageReader;
+import android.os.Handler;
+import android.util.Rational;
 import android.util.Size;
 
 import androidx.annotation.Nullable;
@@ -24,6 +26,9 @@
 import androidx.annotation.RestrictTo.Scope;
 import androidx.camera.core.ImageAnalysisUseCase.ImageReaderMode;
 
+import java.util.Set;
+import java.util.UUID;
+
 /** Configuration for an image analysis use case. */
 public final class ImageAnalysisUseCaseConfiguration
         implements UseCaseConfiguration<ImageAnalysisUseCase>,
@@ -262,5 +267,307 @@
         public ImageAnalysisUseCaseConfiguration build() {
             return new ImageAnalysisUseCaseConfiguration(OptionsBundle.from(mMutableConfig));
         }
+
+        // Start of the default implementation of Configuration.Builder
+        // *****************************************************************************************
+
+        // Implementations of Configuration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public <ValueT> Builder insertOption(Option<ValueT> opt, ValueT value) {
+            getMutableConfiguration().insertOption(opt, value);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @Nullable
+        public <ValueT> Builder removeOption(Option<ValueT> opt) {
+            getMutableConfiguration().removeOption(opt);
+            return builder();
+        }
+
+        // Implementations of TargetConfiguration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setTargetClass(Class<ImageAnalysisUseCase> targetClass) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_CLASS, targetClass);
+
+            // If no name is set yet, then generate a unique name
+            if (null == getMutableConfiguration().retrieveOption(OPTION_TARGET_NAME, null)) {
+                String targetName = targetClass.getCanonicalName() + "-" + UUID.randomUUID();
+                setTargetName(targetName);
+            }
+
+            return builder();
+        }
+
+        @Override
+        public Builder setTargetName(String targetName) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_NAME, targetName);
+            return builder();
+        }
+
+        // Implementations of CameraDeviceConfiguration.Builder default methods
+
+        @Override
+        public Builder setLensFacing(CameraX.LensFacing lensFacing) {
+            getMutableConfiguration().insertOption(OPTION_LENS_FACING, lensFacing);
+            return builder();
+        }
+
+        // Implementations of ImageOutputConfiguration.Builder default methods
+
+        @Override
+        public Builder setTargetAspectRatio(Rational aspectRatio) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_ASPECT_RATIO, aspectRatio);
+            return builder();
+        }
+
+        @Override
+        public Builder setTargetRotation(@RotationValue int rotation) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_ROTATION, rotation);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setMaxResolution(Size resolution) {
+            getMutableConfiguration().insertOption(OPTION_MAX_RESOLUTION, resolution);
+            return builder();
+        }
+
+        // Implementations of ThreadConfiguration.Builder default methods
+
+        @Override
+        public Builder setCallbackHandler(Handler handler) {
+            getMutableConfiguration().insertOption(OPTION_CALLBACK_HANDLER, handler);
+            return builder();
+        }
+
+        // Implementations of UseCaseConfiguration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setDefaultSessionConfiguration(SessionConfiguration sessionConfig) {
+            getMutableConfiguration().insertOption(OPTION_DEFAULT_SESSION_CONFIG, sessionConfig);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setOptionUnpacker(SessionConfiguration.OptionUnpacker optionUnpacker) {
+            getMutableConfiguration().insertOption(OPTION_CONFIG_UNPACKER, optionUnpacker);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setSurfaceOccupancyPriority(int priority) {
+            getMutableConfiguration().insertOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, priority);
+            return builder();
+        }
+
+        // End of the default implementation of Configuration.Builder
+        // *****************************************************************************************
     }
+
+    // Start of the default implementation of Configuration
+    // *********************************************************************************************
+
+    // Implementations of Configuration.Reader default methods
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public boolean containsOption(Option<?> id) {
+        return getConfiguration().containsOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id) {
+        return getConfiguration().retrieveOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id, @Nullable ValueT valueIfMissing) {
+        return getConfiguration().retrieveOption(id, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public void findOptions(String idStem, OptionMatcher matcher) {
+        getConfiguration().findOptions(idStem, matcher);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Set<Option<?>> listOptions() {
+        return getConfiguration().listOptions();
+    }
+
+    // Implementations of TargetConfiguration default methods
+
+    @Override
+    @Nullable
+    public Class<ImageAnalysisUseCase> getTargetClass(
+            @Nullable Class<ImageAnalysisUseCase> valueIfMissing) {
+        @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass()
+                Class<ImageAnalysisUseCase> storedClass =
+                (Class<ImageAnalysisUseCase>) retrieveOption(
+                        OPTION_TARGET_CLASS,
+                        valueIfMissing);
+        return storedClass;
+    }
+
+    @Override
+    public Class<ImageAnalysisUseCase> getTargetClass() {
+        @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass()
+                Class<ImageAnalysisUseCase> storedClass =
+                (Class<ImageAnalysisUseCase>) retrieveOption(
+                        OPTION_TARGET_CLASS);
+        return storedClass;
+    }
+
+    @Override
+    @Nullable
+    public String getTargetName(@Nullable String valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_NAME, valueIfMissing);
+    }
+
+    @Override
+    public String getTargetName() {
+        return retrieveOption(OPTION_TARGET_NAME);
+    }
+
+    // Implementations of CameraDeviceConfiguration default methods
+
+    @Override
+    @Nullable
+    public CameraX.LensFacing getLensFacing(@Nullable CameraX.LensFacing valueIfMissing) {
+        return retrieveOption(OPTION_LENS_FACING, valueIfMissing);
+    }
+
+    @Override
+    public CameraX.LensFacing getLensFacing() {
+        return retrieveOption(OPTION_LENS_FACING);
+    }
+
+    // Implementations of ImageOutputConfiguration default methods
+
+    @Override
+    @Nullable
+    public Rational getTargetAspectRatio(@Nullable Rational valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_ASPECT_RATIO, valueIfMissing);
+    }
+
+    @Override
+    public Rational getTargetAspectRatio() {
+        return retrieveOption(OPTION_TARGET_ASPECT_RATIO);
+    }
+
+    @Override
+    @RotationValue
+    public int getTargetRotation(int valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_ROTATION, valueIfMissing);
+    }
+
+    @Override
+    @RotationValue
+    public int getTargetRotation() {
+        return retrieveOption(OPTION_TARGET_ROTATION);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Size getMaxResolution(Size valueIfMissing) {
+        return retrieveOption(OPTION_MAX_RESOLUTION, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Size getMaxResolution() {
+        return retrieveOption(OPTION_MAX_RESOLUTION);
+    }
+
+    // Implementations of ThreadConfiguration default methods
+
+    @Override
+    @Nullable
+    public Handler getCallbackHandler(@Nullable Handler valueIfMissing) {
+        return retrieveOption(OPTION_CALLBACK_HANDLER, valueIfMissing);
+    }
+
+    @Override
+    public Handler getCallbackHandler() {
+        return retrieveOption(OPTION_CALLBACK_HANDLER);
+    }
+
+    // Implementations of UseCaseConfiguration default methods
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public SessionConfiguration getDefaultSessionConfiguration(
+            @Nullable SessionConfiguration valueIfMissing) {
+        return retrieveOption(OPTION_DEFAULT_SESSION_CONFIG, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public SessionConfiguration getDefaultSessionConfiguration() {
+        return retrieveOption(OPTION_DEFAULT_SESSION_CONFIG);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public SessionConfiguration.OptionUnpacker getOptionUnpacker(
+            @Nullable SessionConfiguration.OptionUnpacker valueIfMissing) {
+        return retrieveOption(OPTION_CONFIG_UNPACKER, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public SessionConfiguration.OptionUnpacker getOptionUnpacker() {
+        return retrieveOption(OPTION_CONFIG_UNPACKER);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public int getSurfaceOccupancyPriority(int valueIfMissing) {
+        return retrieveOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public int getSurfaceOccupancyPriority() {
+        return retrieveOption(OPTION_SURFACE_OCCUPANCY_PRIORITY);
+    }
+
+    // End of the default implementation of Configuration
+    // *********************************************************************************************
 }
diff --git a/camera/core/src/main/java/androidx/camera/core/ImageCaptureUseCase.java b/camera/core/src/main/java/androidx/camera/core/ImageCaptureUseCase.java
index cd86a4d..50c2e17 100644
--- a/camera/core/src/main/java/androidx/camera/core/ImageCaptureUseCase.java
+++ b/camera/core/src/main/java/androidx/camera/core/ImageCaptureUseCase.java
@@ -330,7 +330,7 @@
          */
 
         // Convert the ImageSaver.OnImageSavedListener to ImageCaptureUseCase.OnImageSavedListener
-        ImageSaver.OnImageSavedListener imageSavedListenerWrapper =
+        final ImageSaver.OnImageSavedListener imageSavedListenerWrapper =
                 new ImageSaver.OnImageSavedListener() {
                     @Override
                     public void onImageSaved(File file) {
@@ -576,7 +576,7 @@
      *
      * <p>For example, trigger 3A scan, open torch and check 3A converged if necessary.
      */
-    private ListenableFuture<Void> preTakePicture(TakePictureState state) {
+    private ListenableFuture<Void> preTakePicture(final TakePictureState state) {
         return FluentFuture.from(getPreCaptureStateIfNeeded())
                 .transformAsync(
                         new AsyncFunction<CameraCaptureResult, Boolean>() {
@@ -608,7 +608,7 @@
      *
      * <p>For example, cancel 3A scan, close torch if necessary.
      */
-    private ListenableFuture<Void> postTakePicture(TakePictureState state) {
+    private ListenableFuture<Void> postTakePicture(final TakePictureState state) {
         return Futures.submitAsync(
                 new AsyncCallable<Void>() {
                     @Override
@@ -768,7 +768,7 @@
 
         applyPixelHdrPlusChangeForCaptureMode(mCaptureMode, builder);
 
-        SettableFuture<Void> future = SettableFuture.create();
+        final SettableFuture<Void> future = SettableFuture.create();
         builder.setCameraCaptureCallback(
                 new CameraCaptureCallback() {
                     @Override
@@ -846,18 +846,18 @@
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    public interface OnImageCapturedListener {
+    public abstract static class OnImageCapturedListener {
         /**
          * Callback for when the image has been captured.
          *
          * <p>The listener is responsible for closing the supplied {@link Image}.
          */
-        default void onCaptureSuccess(ImageProxy image, int rotationDegrees) {
+        public void onCaptureSuccess(ImageProxy image, int rotationDegrees) {
             image.close();
         }
 
         /** Callback for when an error occurred during image capture. */
-        default void onError(
+        public void onError(
                 UseCaseError useCaseError, String message, @Nullable Throwable cause) {
         }
     }
diff --git a/camera/core/src/main/java/androidx/camera/core/ImageCaptureUseCaseConfiguration.java b/camera/core/src/main/java/androidx/camera/core/ImageCaptureUseCaseConfiguration.java
index 5d957fc..db2de69 100644
--- a/camera/core/src/main/java/androidx/camera/core/ImageCaptureUseCaseConfiguration.java
+++ b/camera/core/src/main/java/androidx/camera/core/ImageCaptureUseCaseConfiguration.java
@@ -16,11 +16,18 @@
 
 package androidx.camera.core;
 
+import android.os.Handler;
+import android.util.Rational;
+import android.util.Size;
+
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.camera.core.ImageCaptureUseCase.CaptureMode;
 
+import java.util.Set;
+import java.util.UUID;
+
 /** Configuration for an image capture use case. */
 public final class ImageCaptureUseCaseConfiguration
         implements UseCaseConfiguration<ImageCaptureUseCase>,
@@ -191,5 +198,331 @@
             getMutableConfiguration().insertOption(OPTION_FLASH_MODE, flashMode);
             return builder();
         }
+
+
+        // Start of the default implementation of Configuration.Builder
+        // *****************************************************************************************
+
+        // Implementations of Configuration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public <ValueT> Builder insertOption(Option<ValueT> opt, ValueT value) {
+            getMutableConfiguration().insertOption(opt, value);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @Nullable
+        public <ValueT> Builder removeOption(Option<ValueT> opt) {
+            getMutableConfiguration().removeOption(opt);
+            return builder();
+        }
+
+        // Implementations of TargetConfiguration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setTargetClass(Class<ImageCaptureUseCase> targetClass) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_CLASS, targetClass);
+
+            // If no name is set yet, then generate a unique name
+            if (null == getMutableConfiguration().retrieveOption(OPTION_TARGET_NAME, null)) {
+                String targetName = targetClass.getCanonicalName() + "-" + UUID.randomUUID();
+                setTargetName(targetName);
+            }
+
+            return builder();
+        }
+
+        @Override
+        public Builder setTargetName(String targetName) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_NAME, targetName);
+            return builder();
+        }
+
+        // Implementations of CameraDeviceConfiguration.Builder default methods
+
+        @Override
+        public Builder setLensFacing(CameraX.LensFacing lensFacing) {
+            getMutableConfiguration().insertOption(OPTION_LENS_FACING, lensFacing);
+            return builder();
+        }
+
+        // Implementations of ImageOutputConfiguration.Builder default methods
+
+        @Override
+        public Builder setTargetAspectRatio(Rational aspectRatio) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_ASPECT_RATIO, aspectRatio);
+            return builder();
+        }
+
+        @Override
+        public Builder setTargetRotation(@RotationValue int rotation) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_ROTATION, rotation);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setTargetResolution(Size resolution) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_RESOLUTION, resolution);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setMaxResolution(Size resolution) {
+            getMutableConfiguration().insertOption(OPTION_MAX_RESOLUTION, resolution);
+            return builder();
+        }
+
+        // Implementations of ThreadConfiguration.Builder default methods
+
+        @Override
+        public Builder setCallbackHandler(Handler handler) {
+            getMutableConfiguration().insertOption(OPTION_CALLBACK_HANDLER, handler);
+            return builder();
+        }
+
+        // Implementations of UseCaseConfiguration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setDefaultSessionConfiguration(SessionConfiguration sessionConfig) {
+            getMutableConfiguration().insertOption(OPTION_DEFAULT_SESSION_CONFIG, sessionConfig);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setOptionUnpacker(SessionConfiguration.OptionUnpacker optionUnpacker) {
+            getMutableConfiguration().insertOption(OPTION_CONFIG_UNPACKER, optionUnpacker);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setSurfaceOccupancyPriority(int priority) {
+            getMutableConfiguration().insertOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, priority);
+            return builder();
+        }
+
+        // End of the default implementation of Configuration.Builder
+        // *****************************************************************************************
     }
+
+    // Start of the default implementation of Configuration
+    // *********************************************************************************************
+
+    // Implementations of Configuration.Reader default methods
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public boolean containsOption(Option<?> id) {
+        return getConfiguration().containsOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id) {
+        return getConfiguration().retrieveOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id, @Nullable ValueT valueIfMissing) {
+        return getConfiguration().retrieveOption(id, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public void findOptions(String idStem, OptionMatcher matcher) {
+        getConfiguration().findOptions(idStem, matcher);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Set<Option<?>> listOptions() {
+        return getConfiguration().listOptions();
+    }
+
+    // Implementations of TargetConfiguration default methods
+
+    @Override
+    @Nullable
+    public Class<ImageCaptureUseCase> getTargetClass(
+            @Nullable Class<ImageCaptureUseCase> valueIfMissing) {
+        @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass()
+                Class<ImageCaptureUseCase> storedClass =
+                (Class<ImageCaptureUseCase>) retrieveOption(
+                        OPTION_TARGET_CLASS,
+                        valueIfMissing);
+        return storedClass;
+    }
+
+    @Override
+    public Class<ImageCaptureUseCase> getTargetClass() {
+        @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass()
+                Class<ImageCaptureUseCase> storedClass =
+                (Class<ImageCaptureUseCase>) retrieveOption(
+                        OPTION_TARGET_CLASS);
+        return storedClass;
+    }
+
+    @Override
+    @Nullable
+    public String getTargetName(@Nullable String valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_NAME, valueIfMissing);
+    }
+
+    @Override
+    public String getTargetName() {
+        return retrieveOption(OPTION_TARGET_NAME);
+    }
+
+    // Implementations of CameraDeviceConfiguration default methods
+
+    @Override
+    @Nullable
+    public CameraX.LensFacing getLensFacing(@Nullable CameraX.LensFacing valueIfMissing) {
+        return retrieveOption(OPTION_LENS_FACING, valueIfMissing);
+    }
+
+    @Override
+    public CameraX.LensFacing getLensFacing() {
+        return retrieveOption(OPTION_LENS_FACING);
+    }
+
+    // Implementations of ImageOutputConfiguration default methods
+
+    @Override
+    @Nullable
+    public Rational getTargetAspectRatio(@Nullable Rational valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_ASPECT_RATIO, valueIfMissing);
+    }
+
+    @Override
+    public Rational getTargetAspectRatio() {
+        return retrieveOption(OPTION_TARGET_ASPECT_RATIO);
+    }
+
+    @Override
+    @RotationValue
+    public int getTargetRotation(int valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_ROTATION, valueIfMissing);
+    }
+
+    @Override
+    @RotationValue
+    public int getTargetRotation() {
+        return retrieveOption(OPTION_TARGET_ROTATION);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Size getTargetResolution(Size valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_RESOLUTION, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Size getTargetResolution() {
+        return retrieveOption(OPTION_TARGET_RESOLUTION);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Size getMaxResolution(Size valueIfMissing) {
+        return retrieveOption(OPTION_MAX_RESOLUTION, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Size getMaxResolution() {
+        return retrieveOption(OPTION_MAX_RESOLUTION);
+    }
+
+    // Implementations of ThreadConfiguration default methods
+
+    @Override
+    @Nullable
+    public Handler getCallbackHandler(@Nullable Handler valueIfMissing) {
+        return retrieveOption(OPTION_CALLBACK_HANDLER, valueIfMissing);
+    }
+
+    @Override
+    public Handler getCallbackHandler() {
+        return retrieveOption(OPTION_CALLBACK_HANDLER);
+    }
+
+    // Implementations of UseCaseConfiguration default methods
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public SessionConfiguration getDefaultSessionConfiguration(
+            @Nullable SessionConfiguration valueIfMissing) {
+        return retrieveOption(OPTION_DEFAULT_SESSION_CONFIG, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public SessionConfiguration getDefaultSessionConfiguration() {
+        return retrieveOption(OPTION_DEFAULT_SESSION_CONFIG);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public SessionConfiguration.OptionUnpacker getOptionUnpacker(
+            @Nullable SessionConfiguration.OptionUnpacker valueIfMissing) {
+        return retrieveOption(OPTION_CONFIG_UNPACKER, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public SessionConfiguration.OptionUnpacker getOptionUnpacker() {
+        return retrieveOption(OPTION_CONFIG_UNPACKER);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public int getSurfaceOccupancyPriority(int valueIfMissing) {
+        return retrieveOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public int getSurfaceOccupancyPriority() {
+        return retrieveOption(OPTION_SURFACE_OCCUPANCY_PRIORITY);
+    }
+
+    // End of the default implementation of Configuration
+    // *********************************************************************************************
+
 }
diff --git a/camera/core/src/main/java/androidx/camera/core/ImageOutputConfiguration.java b/camera/core/src/main/java/androidx/camera/core/ImageOutputConfiguration.java
index 3f48c16..f4edcf4 100644
--- a/camera/core/src/main/java/androidx/camera/core/ImageOutputConfiguration.java
+++ b/camera/core/src/main/java/androidx/camera/core/ImageOutputConfiguration.java
@@ -82,9 +82,7 @@
      * configuration.
      */
     @Nullable
-    default Rational getTargetAspectRatio(@Nullable Rational valueIfMissing) {
-        return retrieveOption(OPTION_TARGET_ASPECT_RATIO, valueIfMissing);
-    }
+    Rational getTargetAspectRatio(@Nullable Rational valueIfMissing);
 
     /**
      * Retrieves the aspect ratio of the target intending to use images from this configuration.
@@ -96,9 +94,7 @@
      * @return The stored value, if it exists in this configuration.
      * @throws IllegalArgumentException if the option does not exist in this configuration.
      */
-    default Rational getTargetAspectRatio() {
-        return retrieveOption(OPTION_TARGET_ASPECT_RATIO);
-    }
+    Rational getTargetAspectRatio();
 
     /**
      * Retrieves the rotation of the target intending to use images from this configuration.
@@ -112,9 +108,7 @@
      * configuration.
      */
     @RotationValue
-    default int getTargetRotation(int valueIfMissing) {
-        return retrieveOption(OPTION_TARGET_ROTATION, valueIfMissing);
-    }
+    int getTargetRotation(int valueIfMissing);
 
     /**
      * Retrieves the rotation of the target intending to use images from this configuration.
@@ -127,9 +121,7 @@
      * @throws IllegalArgumentException if the option does not exist in this configuration.
      */
     @RotationValue
-    default int getTargetRotation() {
-        return retrieveOption(OPTION_TARGET_ROTATION);
-    }
+    int getTargetRotation();
 
     /**
      * Retrieves the resolution of the target intending to use from this configuration.
@@ -140,9 +132,7 @@
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    default Size getTargetResolution(Size valueIfMissing) {
-        return retrieveOption(OPTION_TARGET_RESOLUTION, valueIfMissing);
-    }
+    Size getTargetResolution(Size valueIfMissing);
 
     /**
      * Retrieves the resolution of the target intending to use from this configuration.
@@ -152,9 +142,7 @@
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    default Size getTargetResolution() {
-        return retrieveOption(OPTION_TARGET_RESOLUTION);
-    }
+    Size getTargetResolution();
 
     // Option Declarations:
     // *********************************************************************************************
@@ -169,9 +157,7 @@
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    default Size getMaxResolution(Size valueIfMissing) {
-        return retrieveOption(OPTION_MAX_RESOLUTION, valueIfMissing);
-    }
+    Size getMaxResolution(Size valueIfMissing);
 
     /**
      * Retrieves the max resolution limitation of the target intending to use from this
@@ -182,9 +168,7 @@
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    default Size getMaxResolution() {
-        return retrieveOption(OPTION_MAX_RESOLUTION);
-    }
+    Size getMaxResolution();
 
     /**
      * Builder for a {@link ImageOutputConfiguration}.
@@ -206,10 +190,7 @@
          *                    height.
          * @return The current Builder.
          */
-        default T setTargetAspectRatio(Rational aspectRatio) {
-            getMutableConfiguration().insertOption(OPTION_TARGET_ASPECT_RATIO, aspectRatio);
-            return builder();
-        }
+        T setTargetAspectRatio(Rational aspectRatio);
 
         /**
          * Sets the rotation of the intended target for images from this configuration.
@@ -221,10 +202,7 @@
          * @param rotation The rotation of the intended target.
          * @return The current Builder.
          */
-        default T setTargetRotation(@RotationValue int rotation) {
-            getMutableConfiguration().insertOption(OPTION_TARGET_ROTATION, rotation);
-            return builder();
-        }
+        T setTargetRotation(@RotationValue int rotation);
 
         /**
          * Sets the resolution of the intended target from this configuration.
@@ -234,10 +212,7 @@
          * @hide
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        default T setTargetResolution(Size resolution) {
-            getMutableConfiguration().insertOption(OPTION_TARGET_RESOLUTION, resolution);
-            return builder();
-        }
+        T setTargetResolution(Size resolution);
 
         /**
          * Sets the max resolution limitation of the intended target from this configuration.
@@ -248,10 +223,7 @@
          * @hide
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        default T setMaxResolution(Size resolution) {
-            getMutableConfiguration().insertOption(OPTION_MAX_RESOLUTION, resolution);
-            return builder();
-        }
+        T setMaxResolution(Size resolution);
     }
 
     /**
diff --git a/camera/core/src/main/java/androidx/camera/core/ImageProxyDownsampler.java b/camera/core/src/main/java/androidx/camera/core/ImageProxyDownsampler.java
index dfaaa1a..0bbbf5b 100644
--- a/camera/core/src/main/java/androidx/camera/core/ImageProxyDownsampler.java
+++ b/camera/core/src/main/java/androidx/camera/core/ImageProxyDownsampler.java
@@ -187,7 +187,7 @@
     }
 
     private static ImageProxy.PlaneProxy createPlaneProxy(
-            int rowStride, int pixelStride, byte[] data) {
+            final int rowStride, final int pixelStride, final byte[] data) {
         return new ImageProxy.PlaneProxy() {
             final ByteBuffer mBuffer = ByteBuffer.wrap(data);
 
diff --git a/camera/core/src/main/java/androidx/camera/core/ImageSaver.java b/camera/core/src/main/java/androidx/camera/core/ImageSaver.java
index d47e0cf..778afad 100644
--- a/camera/core/src/main/java/androidx/camera/core/ImageSaver.java
+++ b/camera/core/src/main/java/androidx/camera/core/ImageSaver.java
@@ -115,7 +115,8 @@
         });
     }
 
-    private void postError(SaveError saveError, String message, @Nullable Throwable cause) {
+    private void postError(final SaveError saveError, final String message,
+            @Nullable final Throwable cause) {
         mHandler.post(new Runnable() {
             @Override
             public void run() {
diff --git a/camera/core/src/main/java/androidx/camera/core/OnFocusCompletedListener.java b/camera/core/src/main/java/androidx/camera/core/OnFocusCompletedListener.java
index d15b18b..b068b29 100644
--- a/camera/core/src/main/java/androidx/camera/core/OnFocusCompletedListener.java
+++ b/camera/core/src/main/java/androidx/camera/core/OnFocusCompletedListener.java
@@ -21,14 +21,11 @@
 /** Listener called when focus scan has completed. */
 public interface OnFocusCompletedListener {
     /** Callback when focus has been locked. */
-    default void onFocusLocked(Rect afRect) {
-    }
+    void onFocusLocked(Rect afRect);
 
     /** Callback when unable to acquire focus. */
-    default void onFocusUnableToLock(Rect afRect) {
-    }
+    void onFocusUnableToLock(Rect afRect);
 
     /** Callback when timeout is reached and af state haven't settled. */
-    default void onFocusTimedOut(Rect afRect) {
-    }
+    void onFocusTimedOut(Rect afRect);
 }
diff --git a/camera/core/src/main/java/androidx/camera/core/SessionConfiguration.java b/camera/core/src/main/java/androidx/camera/core/SessionConfiguration.java
index 2684add..7e758c3 100644
--- a/camera/core/src/main/java/androidx/camera/core/SessionConfiguration.java
+++ b/camera/core/src/main/java/androidx/camera/core/SessionConfiguration.java
@@ -80,7 +80,7 @@
     /** Returns an instance of a session configuration with minimal configurations. */
     public static SessionConfiguration defaultEmptySessionConfiguration() {
         return new SessionConfiguration(
-                new ArrayList<>(),
+                new ArrayList<DeferrableSurface>(),
                 CameraDeviceStateCallbacks.createNoOpCallback(),
                 CameraCaptureSessionStateCallbacks.createNoOpCallback(),
                 new CaptureRequestConfiguration.Builder().build());
diff --git a/camera/core/src/main/java/androidx/camera/core/TargetConfiguration.java b/camera/core/src/main/java/androidx/camera/core/TargetConfiguration.java
index 55aa885..eed17f6 100644
--- a/camera/core/src/main/java/androidx/camera/core/TargetConfiguration.java
+++ b/camera/core/src/main/java/androidx/camera/core/TargetConfiguration.java
@@ -20,8 +20,6 @@
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 
-import java.util.UUID;
-
 /**
  * Configuration containing options used to identify the target class and object being configured.
  *
@@ -54,12 +52,7 @@
      * configuration.
      */
     @Nullable
-    default Class<T> getTargetClass(@Nullable Class<T> valueIfMissing) {
-        @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass()
-                Class<T> storedClass = (Class<T>) retrieveOption(OPTION_TARGET_CLASS,
-                valueIfMissing);
-        return storedClass;
-    }
+    Class<T> getTargetClass(@Nullable Class<T> valueIfMissing);
 
     /**
      * Retrieves the class of the object being configured.
@@ -67,11 +60,7 @@
      * @return The stored value, if it exists in this configuration.
      * @throws IllegalArgumentException if the option does not exist in this configuration.
      */
-    default Class<T> getTargetClass() {
-        @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass()
-                Class<T> storedClass = (Class<T>) retrieveOption(OPTION_TARGET_CLASS);
-        return storedClass;
-    }
+    Class<T> getTargetClass();
 
     /**
      * Retrieves the name of the target object being configured.
@@ -84,9 +73,7 @@
      * configuration.
      */
     @Nullable
-    default String getTargetName(@Nullable String valueIfMissing) {
-        return retrieveOption(OPTION_TARGET_NAME, valueIfMissing);
-    }
+    String getTargetName(@Nullable String valueIfMissing);
 
     // Option Declarations:
     // *********************************************************************************************
@@ -100,9 +87,7 @@
      * @return The stored value, if it exists in this configuration.
      * @throws IllegalArgumentException if the option does not exist in this configuration.
      */
-    default String getTargetName() {
-        return retrieveOption(OPTION_TARGET_NAME);
-    }
+    String getTargetName();
 
     /**
      * Builder for a {@link TargetConfiguration}.
@@ -129,17 +114,7 @@
          * @hide
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        default B setTargetClass(Class<T> targetClass) {
-            getMutableConfiguration().insertOption(OPTION_TARGET_CLASS, targetClass);
-
-            // If no name is set yet, then generate a unique name
-            if (null == getMutableConfiguration().retrieveOption(OPTION_TARGET_NAME, null)) {
-                String targetName = targetClass.getCanonicalName() + "-" + UUID.randomUUID();
-                setTargetName(targetName);
-            }
-
-            return builder();
-        }
+        B setTargetClass(Class<T> targetClass);
 
         /**
          * Sets the name of the target object being configured.
@@ -151,9 +126,6 @@
          *                   configured.
          * @return the current Builder.
          */
-        default B setTargetName(String targetName) {
-            getMutableConfiguration().insertOption(OPTION_TARGET_NAME, targetName);
-            return builder();
-        }
+        B setTargetName(String targetName);
     }
 }
diff --git a/camera/core/src/main/java/androidx/camera/core/ThreadConfiguration.java b/camera/core/src/main/java/androidx/camera/core/ThreadConfiguration.java
index 14026fe..d9ba5a2 100644
--- a/camera/core/src/main/java/androidx/camera/core/ThreadConfiguration.java
+++ b/camera/core/src/main/java/androidx/camera/core/ThreadConfiguration.java
@@ -42,9 +42,7 @@
      * configuration.
      */
     @Nullable
-    default Handler getCallbackHandler(@Nullable Handler valueIfMissing) {
-        return retrieveOption(OPTION_CALLBACK_HANDLER, valueIfMissing);
-    }
+    Handler getCallbackHandler(@Nullable Handler valueIfMissing);
 
     /**
      * Returns the default handler that will be used for callbacks.
@@ -52,9 +50,7 @@
      * @return The stored value, if it exists in this configuration.
      * @throws IllegalArgumentException if the option does not exist in this configuration.
      */
-    default Handler getCallbackHandler() {
-        return retrieveOption(OPTION_CALLBACK_HANDLER);
-    }
+    Handler getCallbackHandler();
 
     // Option Declarations:
     // *********************************************************************************************
@@ -83,9 +79,6 @@
          * @param handler The handler which will be used to post callbacks.
          * @return the current Builder.
          */
-        default B setCallbackHandler(Handler handler) {
-            getMutableConfiguration().insertOption(OPTION_CALLBACK_HANDLER, handler);
-            return builder();
-        }
+        B setCallbackHandler(Handler handler);
     }
 }
diff --git a/camera/core/src/main/java/androidx/camera/core/UseCaseConfiguration.java b/camera/core/src/main/java/androidx/camera/core/UseCaseConfiguration.java
index b31de98..996f3aa8 100644
--- a/camera/core/src/main/java/androidx/camera/core/UseCaseConfiguration.java
+++ b/camera/core/src/main/java/androidx/camera/core/UseCaseConfiguration.java
@@ -69,10 +69,8 @@
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
     @Nullable
-    default SessionConfiguration getDefaultSessionConfiguration(
-            @Nullable SessionConfiguration valueIfMissing) {
-        return retrieveOption(OPTION_DEFAULT_SESSION_CONFIG, valueIfMissing);
-    }
+    SessionConfiguration getDefaultSessionConfiguration(
+            @Nullable SessionConfiguration valueIfMissing);
 
     /**
      * Retrieves the default session configuration for this use case.
@@ -85,9 +83,7 @@
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    default SessionConfiguration getDefaultSessionConfiguration() {
-        return retrieveOption(OPTION_DEFAULT_SESSION_CONFIG);
-    }
+    SessionConfiguration getDefaultSessionConfiguration();
 
     /**
      * Retrieves the {@link SessionConfiguration.OptionUnpacker} for this use case.
@@ -104,10 +100,8 @@
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
     @Nullable
-    default SessionConfiguration.OptionUnpacker getOptionUnpacker(
-            @Nullable SessionConfiguration.OptionUnpacker valueIfMissing) {
-        return retrieveOption(OPTION_CONFIG_UNPACKER, valueIfMissing);
-    }
+    SessionConfiguration.OptionUnpacker getOptionUnpacker(
+            @Nullable SessionConfiguration.OptionUnpacker valueIfMissing);
 
     /**
      * Retrieves the {@link SessionConfiguration.OptionUnpacker} for this use case.
@@ -122,9 +116,7 @@
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    default SessionConfiguration.OptionUnpacker getOptionUnpacker() {
-        return retrieveOption(OPTION_CONFIG_UNPACKER);
-    }
+    SessionConfiguration.OptionUnpacker getOptionUnpacker();
 
     // Option Declarations:
     // *********************************************************************************************
@@ -139,9 +131,7 @@
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    default int getSurfaceOccupancyPriority(int valueIfMissing) {
-        return retrieveOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, valueIfMissing);
-    }
+    int getSurfaceOccupancyPriority(int valueIfMissing);
 
     /**
      * Retrieves the surface occupancy priority of the target intending to use from this
@@ -152,9 +142,7 @@
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    default int getSurfaceOccupancyPriority() {
-        return retrieveOption(OPTION_SURFACE_OCCUPANCY_PRIORITY);
-    }
+    int getSurfaceOccupancyPriority();
 
     /**
      * Builder for a {@link UseCaseConfiguration}.
@@ -176,10 +164,7 @@
          * @hide
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        default B setDefaultSessionConfiguration(SessionConfiguration sessionConfig) {
-            getMutableConfiguration().insertOption(OPTION_DEFAULT_SESSION_CONFIG, sessionConfig);
-            return builder();
-        }
+        B setDefaultSessionConfiguration(SessionConfiguration sessionConfig);
 
         /**
          * Sets the Option Unpacker for translating this configuration into a {@link
@@ -193,10 +178,7 @@
          * @hide
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        default B setOptionUnpacker(SessionConfiguration.OptionUnpacker optionUnpacker) {
-            getMutableConfiguration().insertOption(OPTION_CONFIG_UNPACKER, optionUnpacker);
-            return builder();
-        }
+        B setOptionUnpacker(SessionConfiguration.OptionUnpacker optionUnpacker);
 
         /**
          * Sets the surface occupancy priority of the intended target from this configuration.
@@ -212,9 +194,6 @@
          * @hide
          */
         @RestrictTo(Scope.LIBRARY_GROUP)
-        default B setSurfaceOccupancyPriority(int priority) {
-            getMutableConfiguration().insertOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, priority);
-            return builder();
-        }
+        B setSurfaceOccupancyPriority(int priority);
     }
 }
diff --git a/camera/core/src/main/java/androidx/camera/core/UseCaseGroupLifecycleController.java b/camera/core/src/main/java/androidx/camera/core/UseCaseGroupLifecycleController.java
index b977518..4c9fcbe 100644
--- a/camera/core/src/main/java/androidx/camera/core/UseCaseGroupLifecycleController.java
+++ b/camera/core/src/main/java/androidx/camera/core/UseCaseGroupLifecycleController.java
@@ -17,13 +17,14 @@
 package androidx.camera.core;
 
 import androidx.annotation.GuardedBy;
-import androidx.lifecycle.DefaultLifecycleObserver;
 import androidx.lifecycle.Lifecycle;
 import androidx.lifecycle.Lifecycle.State;
+import androidx.lifecycle.LifecycleObserver;
 import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.OnLifecycleEvent;
 
 /** A {@link UseCaseGroup} whose starting and stopping is controlled by a {@link Lifecycle}. */
-final class UseCaseGroupLifecycleController implements DefaultLifecycleObserver {
+final class UseCaseGroupLifecycleController implements LifecycleObserver {
     private final Object mUseCaseGroupLock = new Object();
 
     @GuardedBy("mUseCaseGroupLock")
@@ -44,21 +45,21 @@
         lifecycle.addObserver(this);
     }
 
-    @Override
+    @OnLifecycleEvent(Lifecycle.Event.ON_START)
     public void onStart(LifecycleOwner lifecycleOwner) {
         synchronized (mUseCaseGroupLock) {
             mUseCaseGroup.start();
         }
     }
 
-    @Override
+    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
     public void onStop(LifecycleOwner lifecycleOwner) {
         synchronized (mUseCaseGroupLock) {
             mUseCaseGroup.stop();
         }
     }
 
-    @Override
+    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
     public void onDestroy(LifecycleOwner lifecycleOwner) {
         synchronized (mUseCaseGroupLock) {
             mUseCaseGroup.clear();
diff --git a/camera/core/src/main/java/androidx/camera/core/UseCaseGroupRepository.java b/camera/core/src/main/java/androidx/camera/core/UseCaseGroupRepository.java
index 2291a75..f18df0b 100644
--- a/camera/core/src/main/java/androidx/camera/core/UseCaseGroupRepository.java
+++ b/camera/core/src/main/java/androidx/camera/core/UseCaseGroupRepository.java
@@ -18,9 +18,11 @@
 
 import androidx.annotation.GuardedBy;
 import androidx.annotation.VisibleForTesting;
-import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.Lifecycle;
 import androidx.lifecycle.Lifecycle.State;
+import androidx.lifecycle.LifecycleObserver;
 import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.OnLifecycleEvent;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -93,9 +95,9 @@
      *
      * @param lifecycleOwner to associate with the group
      * @return a new {@link UseCaseGroupLifecycleController}
-     * @throws IllegalArgumentException if the {@link android.arch.lifecycle.Lifecycle} of
+     * @throws IllegalArgumentException if the {@link androidx.lifecycle.Lifecycle} of
      *                                  lifecycleOwner is already
-     *                                  {@link android.arch.lifecycle.Lifecycle.State.DESTROYED}.
+     *                                  {@link androidx.lifecycle.Lifecycle.State.DESTROYED}.
      */
     private UseCaseGroupLifecycleController createUseCaseGroup(LifecycleOwner lifecycleOwner) {
         if (lifecycleOwner.getLifecycle().getCurrentState() == State.DESTROYED) {
@@ -114,15 +116,15 @@
     }
 
     /**
-     * Creates a {@link DefaultLifecycleObserver} which removes any {@link
+     * Creates a {@link LifecycleObserver} which removes any {@link
      * UseCaseGroupLifecycleController} associated with a {@link LifecycleOwner} from this
      * repository when that lifecycle is destroyed.
      *
-     * @return a new {@link DefaultLifecycleObserver}
+     * @return a new {@link LifecycleObserver}
      */
-    private DefaultLifecycleObserver createRemoveOnDestroyObserver() {
-        return new DefaultLifecycleObserver() {
-            @Override
+    private LifecycleObserver createRemoveOnDestroyObserver() {
+        return new LifecycleObserver() {
+            @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
             public void onDestroy(LifecycleOwner lifecycleOwner) {
                 synchronized (mUseCasesLock) {
                     mLifecycleToUseCaseGroupControllerMap.remove(lifecycleOwner);
diff --git a/camera/core/src/main/java/androidx/camera/core/VideoCaptureUseCase.java b/camera/core/src/main/java/androidx/camera/core/VideoCaptureUseCase.java
index 32565a9..35c17cf 100644
--- a/camera/core/src/main/java/androidx/camera/core/VideoCaptureUseCase.java
+++ b/camera/core/src/main/java/androidx/camera/core/VideoCaptureUseCase.java
@@ -254,7 +254,7 @@
      * @param metadata     Metadata to save with the recorded video
      */
     public void startRecording(
-            File saveLocation, OnVideoSavedListener listener, Metadata metadata) {
+            final File saveLocation, final OnVideoSavedListener listener, Metadata metadata) {
         Log.i(TAG, "startRecording");
 
         if (!mEndOfAudioVideoSignal.get()) {
diff --git a/camera/core/src/main/java/androidx/camera/core/VideoCaptureUseCaseConfiguration.java b/camera/core/src/main/java/androidx/camera/core/VideoCaptureUseCaseConfiguration.java
index 6bed1a98..20b8ab3d 100644
--- a/camera/core/src/main/java/androidx/camera/core/VideoCaptureUseCaseConfiguration.java
+++ b/camera/core/src/main/java/androidx/camera/core/VideoCaptureUseCaseConfiguration.java
@@ -16,9 +16,17 @@
 
 package androidx.camera.core;
 
+import android.os.Handler;
+import android.util.Rational;
+import android.util.Size;
+
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 
+import java.util.Set;
+import java.util.UUID;
+
 /** Configuration for a video capture use case. */
 public final class VideoCaptureUseCaseConfiguration
         implements UseCaseConfiguration<VideoCaptureUseCase>,
@@ -409,5 +417,330 @@
             getMutableConfiguration().insertOption(OPTION_AUDIO_MIN_BUFFER_SIZE, minBufferSize);
             return builder();
         }
+
+        // Start of the default implementation of Configuration.Builder
+        // *****************************************************************************************
+
+        // Implementations of Configuration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public <ValueT> Builder insertOption(Option<ValueT> opt, ValueT value) {
+            getMutableConfiguration().insertOption(opt, value);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @Nullable
+        public <ValueT> Builder removeOption(Option<ValueT> opt) {
+            getMutableConfiguration().removeOption(opt);
+            return builder();
+        }
+
+        // Implementations of TargetConfiguration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setTargetClass(Class<VideoCaptureUseCase> targetClass) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_CLASS, targetClass);
+
+            // If no name is set yet, then generate a unique name
+            if (null == getMutableConfiguration().retrieveOption(OPTION_TARGET_NAME, null)) {
+                String targetName = targetClass.getCanonicalName() + "-" + UUID.randomUUID();
+                setTargetName(targetName);
+            }
+
+            return builder();
+        }
+
+        @Override
+        public Builder setTargetName(String targetName) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_NAME, targetName);
+            return builder();
+        }
+
+        // Implementations of CameraDeviceConfiguration.Builder default methods
+
+        @Override
+        public Builder setLensFacing(CameraX.LensFacing lensFacing) {
+            getMutableConfiguration().insertOption(OPTION_LENS_FACING, lensFacing);
+            return builder();
+        }
+
+        // Implementations of ImageOutputConfiguration.Builder default methods
+
+        @Override
+        public Builder setTargetAspectRatio(Rational aspectRatio) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_ASPECT_RATIO, aspectRatio);
+            return builder();
+        }
+
+        @Override
+        public Builder setTargetRotation(@RotationValue int rotation) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_ROTATION, rotation);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setTargetResolution(Size resolution) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_RESOLUTION, resolution);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setMaxResolution(Size resolution) {
+            getMutableConfiguration().insertOption(OPTION_MAX_RESOLUTION, resolution);
+            return builder();
+        }
+
+        // Implementations of ThreadConfiguration.Builder default methods
+
+        @Override
+        public Builder setCallbackHandler(Handler handler) {
+            getMutableConfiguration().insertOption(OPTION_CALLBACK_HANDLER, handler);
+            return builder();
+        }
+
+        // Implementations of UseCaseConfiguration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setDefaultSessionConfiguration(SessionConfiguration sessionConfig) {
+            getMutableConfiguration().insertOption(OPTION_DEFAULT_SESSION_CONFIG, sessionConfig);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setOptionUnpacker(SessionConfiguration.OptionUnpacker optionUnpacker) {
+            getMutableConfiguration().insertOption(OPTION_CONFIG_UNPACKER, optionUnpacker);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setSurfaceOccupancyPriority(int priority) {
+            getMutableConfiguration().insertOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, priority);
+            return builder();
+        }
+
+        // End of the default implementation of Configuration.Builder
+        // *****************************************************************************************
     }
+
+    // Start of the default implementation of Configuration
+    // *********************************************************************************************
+
+    // Implementations of Configuration.Reader default methods
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public boolean containsOption(Option<?> id) {
+        return getConfiguration().containsOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id) {
+        return getConfiguration().retrieveOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id, @Nullable ValueT valueIfMissing) {
+        return getConfiguration().retrieveOption(id, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public void findOptions(String idStem, OptionMatcher matcher) {
+        getConfiguration().findOptions(idStem, matcher);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Set<Option<?>> listOptions() {
+        return getConfiguration().listOptions();
+    }
+
+    // Implementations of TargetConfiguration default methods
+
+    @Override
+    @Nullable
+    public Class<VideoCaptureUseCase> getTargetClass(
+            @Nullable Class<VideoCaptureUseCase> valueIfMissing) {
+        @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass()
+                Class<VideoCaptureUseCase> storedClass =
+                (Class<VideoCaptureUseCase>) retrieveOption(
+                        OPTION_TARGET_CLASS,
+                        valueIfMissing);
+        return storedClass;
+    }
+
+    @Override
+    public Class<VideoCaptureUseCase> getTargetClass() {
+        @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass()
+                Class<VideoCaptureUseCase> storedClass =
+                (Class<VideoCaptureUseCase>) retrieveOption(
+                        OPTION_TARGET_CLASS);
+        return storedClass;
+    }
+
+    @Override
+    @Nullable
+    public String getTargetName(@Nullable String valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_NAME, valueIfMissing);
+    }
+
+    @Override
+    public String getTargetName() {
+        return retrieveOption(OPTION_TARGET_NAME);
+    }
+
+    // Implementations of CameraDeviceConfiguration default methods
+
+    @Override
+    @Nullable
+    public CameraX.LensFacing getLensFacing(@Nullable CameraX.LensFacing valueIfMissing) {
+        return retrieveOption(OPTION_LENS_FACING, valueIfMissing);
+    }
+
+    @Override
+    public CameraX.LensFacing getLensFacing() {
+        return retrieveOption(OPTION_LENS_FACING);
+    }
+
+    // Implementations of ImageOutputConfiguration default methods
+
+    @Override
+    @Nullable
+    public Rational getTargetAspectRatio(@Nullable Rational valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_ASPECT_RATIO, valueIfMissing);
+    }
+
+    @Override
+    public Rational getTargetAspectRatio() {
+        return retrieveOption(OPTION_TARGET_ASPECT_RATIO);
+    }
+
+    @Override
+    @RotationValue
+    public int getTargetRotation(int valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_ROTATION, valueIfMissing);
+    }
+
+    @Override
+    @RotationValue
+    public int getTargetRotation() {
+        return retrieveOption(OPTION_TARGET_ROTATION);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Size getTargetResolution(Size valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_RESOLUTION, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Size getTargetResolution() {
+        return retrieveOption(OPTION_TARGET_RESOLUTION);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Size getMaxResolution(Size valueIfMissing) {
+        return retrieveOption(OPTION_MAX_RESOLUTION, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Size getMaxResolution() {
+        return retrieveOption(OPTION_MAX_RESOLUTION);
+    }
+
+    // Implementations of ThreadConfiguration default methods
+
+    @Override
+    @Nullable
+    public Handler getCallbackHandler(@Nullable Handler valueIfMissing) {
+        return retrieveOption(OPTION_CALLBACK_HANDLER, valueIfMissing);
+    }
+
+    @Override
+    public Handler getCallbackHandler() {
+        return retrieveOption(OPTION_CALLBACK_HANDLER);
+    }
+
+    // Implementations of UseCaseConfiguration default methods
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public SessionConfiguration getDefaultSessionConfiguration(
+            @Nullable SessionConfiguration valueIfMissing) {
+        return retrieveOption(OPTION_DEFAULT_SESSION_CONFIG, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public SessionConfiguration getDefaultSessionConfiguration() {
+        return retrieveOption(OPTION_DEFAULT_SESSION_CONFIG);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public SessionConfiguration.OptionUnpacker getOptionUnpacker(
+            @Nullable SessionConfiguration.OptionUnpacker valueIfMissing) {
+        return retrieveOption(OPTION_CONFIG_UNPACKER, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public SessionConfiguration.OptionUnpacker getOptionUnpacker() {
+        return retrieveOption(OPTION_CONFIG_UNPACKER);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public int getSurfaceOccupancyPriority(int valueIfMissing) {
+        return retrieveOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public int getSurfaceOccupancyPriority() {
+        return retrieveOption(OPTION_SURFACE_OCCUPANCY_PRIORITY);
+    }
+
+    // End of the default implementation of Configuration
+    // *********************************************************************************************
+
 }
diff --git a/camera/core/src/main/java/androidx/camera/core/ViewFinderUseCaseConfiguration.java b/camera/core/src/main/java/androidx/camera/core/ViewFinderUseCaseConfiguration.java
index 116fe38..a42065a 100644
--- a/camera/core/src/main/java/androidx/camera/core/ViewFinderUseCaseConfiguration.java
+++ b/camera/core/src/main/java/androidx/camera/core/ViewFinderUseCaseConfiguration.java
@@ -16,11 +16,17 @@
 
 package androidx.camera.core;
 
+import android.os.Handler;
+import android.util.Rational;
 import android.util.Size;
 
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 
+import java.util.Set;
+import java.util.UUID;
+
 /** Configuration for an image capture use case. */
 public final class ViewFinderUseCaseConfiguration
         implements UseCaseConfiguration<ViewFinderUseCase>,
@@ -157,5 +163,306 @@
         public ViewFinderUseCaseConfiguration build() {
             return new ViewFinderUseCaseConfiguration(OptionsBundle.from(mMutableConfig));
         }
+
+        // Start of the default implementation of Configuration.Builder
+        // *****************************************************************************************
+
+        // Implementations of Configuration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public <ValueT> Builder insertOption(Option<ValueT> opt, ValueT value) {
+            getMutableConfiguration().insertOption(opt, value);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @Nullable
+        public <ValueT> Builder removeOption(Option<ValueT> opt) {
+            getMutableConfiguration().removeOption(opt);
+            return builder();
+        }
+
+        // Implementations of TargetConfiguration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setTargetClass(Class<ViewFinderUseCase> targetClass) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_CLASS, targetClass);
+
+            // If no name is set yet, then generate a unique name
+            if (null == getMutableConfiguration().retrieveOption(OPTION_TARGET_NAME, null)) {
+                String targetName = targetClass.getCanonicalName() + "-" + UUID.randomUUID();
+                setTargetName(targetName);
+            }
+
+            return builder();
+        }
+
+        @Override
+        public Builder setTargetName(String targetName) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_NAME, targetName);
+            return builder();
+        }
+
+        // Implementations of CameraDeviceConfiguration.Builder default methods
+
+        @Override
+        public Builder setLensFacing(CameraX.LensFacing lensFacing) {
+            getMutableConfiguration().insertOption(OPTION_LENS_FACING, lensFacing);
+            return builder();
+        }
+
+        // Implementations of ImageOutputConfiguration.Builder default methods
+
+        @Override
+        public Builder setTargetAspectRatio(Rational aspectRatio) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_ASPECT_RATIO, aspectRatio);
+            return builder();
+        }
+
+        @Override
+        public Builder setTargetRotation(@RotationValue int rotation) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_ROTATION, rotation);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setMaxResolution(Size resolution) {
+            getMutableConfiguration().insertOption(OPTION_MAX_RESOLUTION, resolution);
+            return builder();
+        }
+
+        // Implementations of ThreadConfiguration.Builder default methods
+
+        @Override
+        public Builder setCallbackHandler(Handler handler) {
+            getMutableConfiguration().insertOption(OPTION_CALLBACK_HANDLER, handler);
+            return builder();
+        }
+
+        // Implementations of UseCaseConfiguration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setDefaultSessionConfiguration(SessionConfiguration sessionConfig) {
+            getMutableConfiguration().insertOption(OPTION_DEFAULT_SESSION_CONFIG, sessionConfig);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setOptionUnpacker(SessionConfiguration.OptionUnpacker optionUnpacker) {
+            getMutableConfiguration().insertOption(OPTION_CONFIG_UNPACKER, optionUnpacker);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public Builder setSurfaceOccupancyPriority(int priority) {
+            getMutableConfiguration().insertOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, priority);
+            return builder();
+        }
+
+        // End of the default implementation of Configuration.Builder
+        // *****************************************************************************************
+
     }
+
+    // Start of the default implementation of Configuration
+    // *********************************************************************************************
+
+    // Implementations of Configuration.Reader default methods
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public boolean containsOption(Option<?> id) {
+        return getConfiguration().containsOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id) {
+        return getConfiguration().retrieveOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id, @Nullable ValueT valueIfMissing) {
+        return getConfiguration().retrieveOption(id, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public void findOptions(String idStem, OptionMatcher matcher) {
+        getConfiguration().findOptions(idStem, matcher);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Set<Option<?>> listOptions() {
+        return getConfiguration().listOptions();
+    }
+
+    // Implementations of TargetConfiguration default methods
+
+    @Override
+    @Nullable
+    public Class<ViewFinderUseCase> getTargetClass(
+            @Nullable Class<ViewFinderUseCase> valueIfMissing) {
+        @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass()
+                Class<ViewFinderUseCase> storedClass = (Class<ViewFinderUseCase>) retrieveOption(
+                OPTION_TARGET_CLASS,
+                valueIfMissing);
+        return storedClass;
+    }
+
+    @Override
+    public Class<ViewFinderUseCase> getTargetClass() {
+        @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass()
+                Class<ViewFinderUseCase> storedClass = (Class<ViewFinderUseCase>) retrieveOption(
+                OPTION_TARGET_CLASS);
+        return storedClass;
+    }
+
+    @Override
+    @Nullable
+    public String getTargetName(@Nullable String valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_NAME, valueIfMissing);
+    }
+
+    @Override
+    public String getTargetName() {
+        return retrieveOption(OPTION_TARGET_NAME);
+    }
+
+    // Implementations of CameraDeviceConfiguration default methods
+
+    @Override
+    @Nullable
+    public CameraX.LensFacing getLensFacing(@Nullable CameraX.LensFacing valueIfMissing) {
+        return retrieveOption(OPTION_LENS_FACING, valueIfMissing);
+    }
+
+    @Override
+    public CameraX.LensFacing getLensFacing() {
+        return retrieveOption(OPTION_LENS_FACING);
+    }
+
+    // Implementations of ImageOutputConfiguration default methods
+
+    @Override
+    @Nullable
+    public Rational getTargetAspectRatio(@Nullable Rational valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_ASPECT_RATIO, valueIfMissing);
+    }
+
+    @Override
+    public Rational getTargetAspectRatio() {
+        return retrieveOption(OPTION_TARGET_ASPECT_RATIO);
+    }
+
+    @Override
+    @RotationValue
+    public int getTargetRotation(int valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_ROTATION, valueIfMissing);
+    }
+
+    @Override
+    @RotationValue
+    public int getTargetRotation() {
+        return retrieveOption(OPTION_TARGET_ROTATION);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Size getMaxResolution(Size valueIfMissing) {
+        return retrieveOption(OPTION_MAX_RESOLUTION, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Size getMaxResolution() {
+        return retrieveOption(OPTION_MAX_RESOLUTION);
+    }
+
+    // Implementations of ThreadConfiguration default methods
+
+    @Override
+    @Nullable
+    public Handler getCallbackHandler(@Nullable Handler valueIfMissing) {
+        return retrieveOption(OPTION_CALLBACK_HANDLER, valueIfMissing);
+    }
+
+    @Override
+    public Handler getCallbackHandler() {
+        return retrieveOption(OPTION_CALLBACK_HANDLER);
+    }
+
+    // Implementations of UseCaseConfiguration default methods
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public SessionConfiguration getDefaultSessionConfiguration(
+            @Nullable SessionConfiguration valueIfMissing) {
+        return retrieveOption(OPTION_DEFAULT_SESSION_CONFIG, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public SessionConfiguration getDefaultSessionConfiguration() {
+        return retrieveOption(OPTION_DEFAULT_SESSION_CONFIG);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public SessionConfiguration.OptionUnpacker getOptionUnpacker(
+            @Nullable SessionConfiguration.OptionUnpacker valueIfMissing) {
+        return retrieveOption(OPTION_CONFIG_UNPACKER, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public SessionConfiguration.OptionUnpacker getOptionUnpacker() {
+        return retrieveOption(OPTION_CONFIG_UNPACKER);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public int getSurfaceOccupancyPriority(int valueIfMissing) {
+        return retrieveOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    public int getSurfaceOccupancyPriority() {
+        return retrieveOption(OPTION_SURFACE_OCCUPANCY_PRIORITY);
+    }
+
+    // End of the default implementation of Configuration
+    // *********************************************************************************************
 }
diff --git a/camera/testing/src/main/java/androidx/camera/testing/CameraUtil.java b/camera/testing/src/main/java/androidx/camera/testing/CameraUtil.java
index 566e3d2..b4e2c0f 100644
--- a/camera/testing/src/main/java/androidx/camera/testing/CameraUtil.java
+++ b/camera/testing/src/main/java/androidx/camera/testing/CameraUtil.java
@@ -57,7 +57,7 @@
     public static CameraDevice getCameraDevice()
             throws CameraAccessException, InterruptedException {
         // Setup threading required for callback on openCamera()
-        HandlerThread handlerThread = new HandlerThread("handler thread");
+        final HandlerThread handlerThread = new HandlerThread("handler thread");
         handlerThread.start();
         Handler handler = new Handler(handlerThread.getLooper());
 
@@ -73,11 +73,11 @@
 
         // Use an AtomicReference to store the CameraDevice because it is initialized in a lambda.
         // This way the AtomicReference itself is effectively final.
-        AtomicReference<CameraDevice> cameraDeviceHolder = new AtomicReference<>();
+        final AtomicReference<CameraDevice> cameraDeviceHolder = new AtomicReference<>();
 
         // Open the camera using the CameraManager which returns a valid and open CameraDevice only
         // when onOpened() is called.
-        CountDownLatch latch = new CountDownLatch(1);
+        final CountDownLatch latch = new CountDownLatch(1);
         cameraManager.openCamera(
                 cameraName,
                 new StateCallback() {
diff --git a/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeCamera.java b/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeCamera.java
index a3e5e6a..149ada6 100644
--- a/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeCamera.java
+++ b/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeCamera.java
@@ -26,7 +26,7 @@
 
 /** A fake camera which will not produce any data. */
 public class FakeCamera implements BaseCamera {
-    private final CameraControl mCameraControl = CameraControl.defaultEmptyInstance();
+    private final CameraControl mCameraControl = CameraControl.DEFAULT_EMPTY_INSTANCE;
 
     private final CameraInfo mCameraInfo;
 
diff --git a/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfo.java b/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfo.java
index d9b15d9..8e92b54 100644
--- a/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfo.java
+++ b/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfo.java
@@ -16,6 +16,8 @@
 
 package androidx.camera.testing.fakes;
 
+import android.view.Surface;
+
 import androidx.annotation.Nullable;
 import androidx.camera.core.CameraInfo;
 import androidx.camera.core.CameraX.LensFacing;
@@ -50,4 +52,9 @@
     public int getSensorRotationDegrees(@RotationValue int relativeRotation) {
         return mSensorRotation;
     }
+
+    @Override
+    public int getSensorRotationDegrees() {
+        return getSensorRotationDegrees(Surface.ROTATION_0);
+    }
 }
diff --git a/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeConfiguration.java b/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeConfiguration.java
index 416becc..7818126 100644
--- a/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeConfiguration.java
+++ b/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeConfiguration.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.testing.fakes;
 
+import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.camera.core.Configuration;
@@ -23,6 +24,8 @@
 import androidx.camera.core.MutableOptionsBundle;
 import androidx.camera.core.OptionsBundle;
 
+import java.util.Set;
+
 /**
  * Wrapper for an empty Configuration
  *
@@ -65,5 +68,75 @@
         public FakeConfiguration build() {
             return new FakeConfiguration(OptionsBundle.from(mOptionsBundle));
         }
+
+        // Start of the default implementation of Configuration.Builder
+        // *****************************************************************************************
+
+        // Implementations of Configuration.Builder default methods
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        public <ValueT> Builder insertOption(Option<ValueT> opt, ValueT value) {
+            getMutableConfiguration().insertOption(opt, value);
+            return builder();
+        }
+
+        /** @hide */
+        @RestrictTo(Scope.LIBRARY_GROUP)
+        @Override
+        @Nullable
+        public <ValueT> Builder removeOption(Option<ValueT> opt) {
+            getMutableConfiguration().removeOption(opt);
+            return builder();
+        }
+
+        // End of the default implementation of Configuration.Builder
+        // *****************************************************************************************
     }
+
+    // Start of the default implementation of Configuration
+    // *********************************************************************************************
+
+    // Implementations of Configuration.Reader default methods
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public boolean containsOption(Option<?> id) {
+        return getConfiguration().containsOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id) {
+        return getConfiguration().retrieveOption(id);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id, @Nullable ValueT valueIfMissing) {
+        return getConfiguration().retrieveOption(id, valueIfMissing);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public void findOptions(String idStem, OptionMatcher matcher) {
+        getConfiguration().findOptions(idStem, matcher);
+    }
+
+    /** @hide */
+    @RestrictTo(Scope.LIBRARY_GROUP)
+    @Override
+    public Set<Option<?>> listOptions() {
+        return getConfiguration().listOptions();
+    }
+
+    // End of the default implementation of Configuration
+    // *********************************************************************************************
 }
diff --git a/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfiguration.java b/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfiguration.java
index d2f4af7..9b969d2 100644
--- a/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfiguration.java
+++ b/camera/testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfiguration.java
@@ -16,13 +16,19 @@
 
 package androidx.camera.testing.fakes;
 
+import androidx.annotation.Nullable;
 import androidx.camera.core.CameraDeviceConfiguration;
+import androidx.camera.core.CameraX;
 import androidx.camera.core.Configuration;
 import androidx.camera.core.MutableConfiguration;
 import androidx.camera.core.MutableOptionsBundle;
 import androidx.camera.core.OptionsBundle;
+import androidx.camera.core.SessionConfiguration;
 import androidx.camera.core.UseCaseConfiguration;
 
+import java.util.Set;
+import java.util.UUID;
+
 /** A fake configuration for {@link FakeUseCase}. */
 public class FakeUseCaseConfiguration
         implements UseCaseConfiguration<FakeUseCase>, CameraDeviceConfiguration {
@@ -64,5 +70,191 @@
         public FakeUseCaseConfiguration build() {
             return new FakeUseCaseConfiguration(OptionsBundle.from(mOptionsBundle));
         }
+
+        // Start of the default implementation of Configuration.Builder
+        // *****************************************************************************************
+
+        // Implementations of Configuration.Builder default methods
+
+        @Override
+        public <ValueT> Builder insertOption(Option<ValueT> opt, ValueT value) {
+            getMutableConfiguration().insertOption(opt, value);
+            return builder();
+        }
+
+        @Override
+        @Nullable
+        public <ValueT> Builder removeOption(Option<ValueT> opt) {
+            getMutableConfiguration().removeOption(opt);
+            return builder();
+        }
+
+        // Implementations of TargetConfiguration.Builder default methods
+
+        @Override
+        public Builder setTargetClass(Class<FakeUseCase> targetClass) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_CLASS, targetClass);
+
+            // If no name is set yet, then generate a unique name
+            if (null == getMutableConfiguration().retrieveOption(OPTION_TARGET_NAME, null)) {
+                String targetName = targetClass.getCanonicalName() + "-" + UUID.randomUUID();
+                setTargetName(targetName);
+            }
+
+            return builder();
+        }
+
+        @Override
+        public Builder setTargetName(String targetName) {
+            getMutableConfiguration().insertOption(OPTION_TARGET_NAME, targetName);
+            return builder();
+        }
+
+        // Implementations of CameraDeviceConfiguration.Builder default methods
+
+        @Override
+        public Builder setLensFacing(CameraX.LensFacing lensFacing) {
+            getMutableConfiguration().insertOption(OPTION_LENS_FACING, lensFacing);
+            return builder();
+        }
+
+        // Implementations of UseCaseConfiguration.Builder default methods
+
+        @Override
+        public Builder setDefaultSessionConfiguration(SessionConfiguration sessionConfig) {
+            getMutableConfiguration().insertOption(OPTION_DEFAULT_SESSION_CONFIG, sessionConfig);
+            return builder();
+        }
+
+        @Override
+        public Builder setOptionUnpacker(SessionConfiguration.OptionUnpacker optionUnpacker) {
+            getMutableConfiguration().insertOption(OPTION_CONFIG_UNPACKER, optionUnpacker);
+            return builder();
+        }
+
+        @Override
+        public Builder setSurfaceOccupancyPriority(int priority) {
+            getMutableConfiguration().insertOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, priority);
+            return builder();
+        }
+
+        // End of the default implementation of Configuration.Builder
+        // *****************************************************************************************
     }
+
+    // Start of the default implementation of Configuration
+    // *********************************************************************************************
+
+    // Implementations of Configuration.Reader default methods
+
+    @Override
+    public boolean containsOption(Option<?> id) {
+        return getConfiguration().containsOption(id);
+    }
+
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id) {
+        return getConfiguration().retrieveOption(id);
+    }
+
+    @Override
+    @Nullable
+    public <ValueT> ValueT retrieveOption(Option<ValueT> id, @Nullable ValueT valueIfMissing) {
+        return getConfiguration().retrieveOption(id, valueIfMissing);
+    }
+
+    @Override
+    public void findOptions(String idStem, OptionMatcher matcher) {
+        getConfiguration().findOptions(idStem, matcher);
+    }
+
+    @Override
+    public Set<Option<?>> listOptions() {
+        return getConfiguration().listOptions();
+    }
+
+    // Implementations of TargetConfiguration default methods
+
+    @Override
+    @Nullable
+    public Class<FakeUseCase> getTargetClass(
+            @Nullable Class<FakeUseCase> valueIfMissing) {
+        @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass()
+                Class<FakeUseCase> storedClass = (Class<FakeUseCase>) retrieveOption(
+                OPTION_TARGET_CLASS,
+                valueIfMissing);
+        return storedClass;
+    }
+
+    @Override
+    public Class<FakeUseCase> getTargetClass() {
+        @SuppressWarnings("unchecked") // Value should only be added via Builder#setTargetClass()
+                Class<FakeUseCase> storedClass = (Class<FakeUseCase>) retrieveOption(
+                OPTION_TARGET_CLASS);
+        return storedClass;
+    }
+
+    @Override
+    @Nullable
+    public String getTargetName(@Nullable String valueIfMissing) {
+        return retrieveOption(OPTION_TARGET_NAME, valueIfMissing);
+    }
+
+    @Override
+    public String getTargetName() {
+        return retrieveOption(OPTION_TARGET_NAME);
+    }
+
+    // Implementations of CameraDeviceConfiguration default methods
+
+    @Override
+    @Nullable
+    public CameraX.LensFacing getLensFacing(@Nullable CameraX.LensFacing valueIfMissing) {
+        return retrieveOption(OPTION_LENS_FACING, valueIfMissing);
+    }
+
+    @Override
+    public CameraX.LensFacing getLensFacing() {
+        return retrieveOption(OPTION_LENS_FACING);
+    }
+
+    // Implementations of UseCaseConfiguration default methods
+
+    @Override
+    @Nullable
+    public SessionConfiguration getDefaultSessionConfiguration(
+            @Nullable SessionConfiguration valueIfMissing) {
+        return retrieveOption(OPTION_DEFAULT_SESSION_CONFIG, valueIfMissing);
+    }
+
+    @Override
+    public SessionConfiguration getDefaultSessionConfiguration() {
+        return retrieveOption(OPTION_DEFAULT_SESSION_CONFIG);
+    }
+
+    @Override
+    @Nullable
+    public SessionConfiguration.OptionUnpacker getOptionUnpacker(
+            @Nullable SessionConfiguration.OptionUnpacker valueIfMissing) {
+        return retrieveOption(OPTION_CONFIG_UNPACKER, valueIfMissing);
+    }
+
+    @Override
+    public SessionConfiguration.OptionUnpacker getOptionUnpacker() {
+        return retrieveOption(OPTION_CONFIG_UNPACKER);
+    }
+
+    @Override
+    public int getSurfaceOccupancyPriority(int valueIfMissing) {
+        return retrieveOption(OPTION_SURFACE_OCCUPANCY_PRIORITY, valueIfMissing);
+    }
+
+    @Override
+    public int getSurfaceOccupancyPriority() {
+        return retrieveOption(OPTION_SURFACE_OCCUPANCY_PRIORITY);
+    }
+
+    // End of the default implementation of Configuration
+    // *********************************************************************************************
 }
diff --git a/camera/view/src/main/java/androidx/camera/view/CameraXModule.java b/camera/view/src/main/java/androidx/camera/view/CameraXModule.java
index 20b0d48..b225d9e 100644
--- a/camera/view/src/main/java/androidx/camera/view/CameraXModule.java
+++ b/camera/view/src/main/java/androidx/camera/view/CameraXModule.java
@@ -50,10 +50,10 @@
 import androidx.camera.core.ViewFinderUseCaseConfiguration;
 import androidx.camera.view.CameraView.CaptureMode;
 import androidx.camera.view.CameraView.Quality;
-import androidx.lifecycle.DefaultLifecycleObserver;
 import androidx.lifecycle.Lifecycle;
 import androidx.lifecycle.LifecycleObserver;
 import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.OnLifecycleEvent;
 
 import java.io.File;
 import java.util.Arrays;
@@ -91,8 +91,8 @@
     @Nullable
     LifecycleOwner mCurrentLifecycle;
     private final LifecycleObserver mCurrentLifecycleObserver =
-            new DefaultLifecycleObserver() {
-                @Override
+            new LifecycleObserver() {
+                @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
                 public void onDestroy(LifecycleOwner owner) {
                     if (owner == mCurrentLifecycle) {
                         clearCurrentLifecycle();
@@ -179,7 +179,7 @@
             throw new IllegalArgumentException("Cannot bind to lifecycle in a destroyed state.");
         }
 
-        int cameraOrientation;
+        final int cameraOrientation;
         try {
             String cameraId;
             Set<LensFacing> available = getAvailableCameraLensFacing();
@@ -250,18 +250,22 @@
 
         mViewFinderUseCase = new ViewFinderUseCase(mViewFinderConfigBuilder.build());
         mViewFinderUseCase.setOnViewFinderOutputUpdateListener(
-                output -> {
-                    boolean needReverse = cameraOrientation != 0 && cameraOrientation != 180;
-                    int textureWidth =
-                            needReverse
-                                    ? output.getTextureSize().getHeight()
-                                    : output.getTextureSize().getWidth();
-                    int textureHeight =
-                            needReverse
-                                    ? output.getTextureSize().getWidth()
-                                    : output.getTextureSize().getHeight();
-                    onViewfinderSourceDimensUpdated(textureWidth, textureHeight);
-                    setSurfaceTexture(output.getSurfaceTexture());
+                new ViewFinderUseCase.OnViewFinderOutputUpdateListener() {
+                    @Override
+                    public void onUpdated(ViewFinderUseCase.ViewFinderOutput output) {
+                        boolean needReverse = cameraOrientation != 0 && cameraOrientation != 180;
+                        int textureWidth =
+                                needReverse
+                                        ? output.getTextureSize().getHeight()
+                                        : output.getTextureSize().getWidth();
+                        int textureHeight =
+                                needReverse
+                                        ? output.getTextureSize().getWidth()
+                                        : output.getTextureSize().getHeight();
+                        CameraXModule.this.onViewfinderSourceDimensUpdated(textureWidth,
+                                textureHeight);
+                        CameraXModule.this.setSurfaceTexture(output.getSurfaceTexture());
+                    }
                 });
 
         if (getCaptureMode() == CaptureMode.IMAGE) {
@@ -323,7 +327,7 @@
         mImageCaptureUseCase.takePicture(saveLocation, listener, metadata);
     }
 
-    public void startRecording(File file, OnVideoSavedListener listener) {
+    public void startRecording(File file, final OnVideoSavedListener listener) {
         if (mVideoCaptureUseCase == null) {
             return;
         }