Merge "[CameraViewfinder] Add new public constructor for ViewfinderSurfaceRequest." into androidx-main
diff --git a/camera/camera-viewfinder/api/1.1.0-beta03.txt b/camera/camera-viewfinder/api/1.1.0-beta03.txt
deleted file mode 100644
index e6f50d0..0000000
--- a/camera/camera-viewfinder/api/1.1.0-beta03.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 4.0
diff --git a/camera/camera-viewfinder/api/1.1.0-beta04.txt b/camera/camera-viewfinder/api/1.1.0-beta04.txt
deleted file mode 100644
index e6f50d0..0000000
--- a/camera/camera-viewfinder/api/1.1.0-beta04.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 4.0
diff --git a/camera/camera-viewfinder/api/1.2.0-beta01.txt b/camera/camera-viewfinder/api/1.2.0-beta01.txt
deleted file mode 100644
index d452929..0000000
--- a/camera/camera-viewfinder/api/1.2.0-beta01.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// Signature format: 4.0
-package androidx.camera.viewfinder {
-
-  @RequiresApi(21) public final class CameraViewfinder extends android.widget.FrameLayout {
-    ctor @UiThread public CameraViewfinder(android.content.Context);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int, int);
-    method @UiThread public android.graphics.Bitmap? getBitmap();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
-    method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
-    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
-    method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ImplementationMode {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode COMPATIBLE;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode PERFORMANCE;
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ScaleType {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_START;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_START;
-  }
-
-  @RequiresApi(21) public class ViewfinderSurfaceRequest {
-    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
-    method public android.util.Size getResolution();
-    method public int getSensorOrientation();
-    method public boolean isFrontCamera();
-    method public boolean isLegacyDevice();
-    method public void markSurfaceSafeToRelease();
-  }
-
-}
-
diff --git a/camera/camera-viewfinder/api/1.2.0-beta02.txt b/camera/camera-viewfinder/api/1.2.0-beta02.txt
deleted file mode 100644
index d452929..0000000
--- a/camera/camera-viewfinder/api/1.2.0-beta02.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// Signature format: 4.0
-package androidx.camera.viewfinder {
-
-  @RequiresApi(21) public final class CameraViewfinder extends android.widget.FrameLayout {
-    ctor @UiThread public CameraViewfinder(android.content.Context);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int, int);
-    method @UiThread public android.graphics.Bitmap? getBitmap();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
-    method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
-    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
-    method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ImplementationMode {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode COMPATIBLE;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode PERFORMANCE;
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ScaleType {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_START;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_START;
-  }
-
-  @RequiresApi(21) public class ViewfinderSurfaceRequest {
-    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
-    method public android.util.Size getResolution();
-    method public int getSensorOrientation();
-    method public boolean isFrontCamera();
-    method public boolean isLegacyDevice();
-    method public void markSurfaceSafeToRelease();
-  }
-
-}
-
diff --git a/camera/camera-viewfinder/api/1.2.0-beta03.txt b/camera/camera-viewfinder/api/1.2.0-beta03.txt
index d452929..04cecbd 100644
--- a/camera/camera-viewfinder/api/1.2.0-beta03.txt
+++ b/camera/camera-viewfinder/api/1.2.0-beta03.txt
@@ -1,41 +1,2 @@
 // Signature format: 4.0
-package androidx.camera.viewfinder {
-
-  @RequiresApi(21) public final class CameraViewfinder extends android.widget.FrameLayout {
-    ctor @UiThread public CameraViewfinder(android.content.Context);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int, int);
-    method @UiThread public android.graphics.Bitmap? getBitmap();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
-    method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
-    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
-    method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ImplementationMode {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode COMPATIBLE;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode PERFORMANCE;
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ScaleType {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_START;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_START;
-  }
-
-  @RequiresApi(21) public class ViewfinderSurfaceRequest {
-    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
-    method public android.util.Size getResolution();
-    method public int getSensorOrientation();
-    method public boolean isFrontCamera();
-    method public boolean isLegacyDevice();
-    method public void markSurfaceSafeToRelease();
-  }
-
-}
 
diff --git a/camera/camera-viewfinder/api/current.txt b/camera/camera-viewfinder/api/current.txt
index d452929..0023b9c 100644
--- a/camera/camera-viewfinder/api/current.txt
+++ b/camera/camera-viewfinder/api/current.txt
@@ -10,7 +10,6 @@
     method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
     method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
     method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
-    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
     method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
   }
 
@@ -29,13 +28,24 @@
   }
 
   @RequiresApi(21) public class ViewfinderSurfaceRequest {
-    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
+    method public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode? getImplementationMode();
+    method public int getLensFacing();
     method public android.util.Size getResolution();
     method public int getSensorOrientation();
-    method public boolean isFrontCamera();
-    method public boolean isLegacyDevice();
     method public void markSurfaceSafeToRelease();
   }
 
+  public static final class ViewfinderSurfaceRequest.Builder {
+    ctor public ViewfinderSurfaceRequest.Builder(android.util.Size);
+    method public androidx.camera.viewfinder.ViewfinderSurfaceRequest build();
+    method public androidx.camera.viewfinder.ViewfinderSurfaceRequest.Builder setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
+    method public androidx.camera.viewfinder.ViewfinderSurfaceRequest.Builder setLensFacing(int);
+    method public androidx.camera.viewfinder.ViewfinderSurfaceRequest.Builder setSensorOrientation(int);
+  }
+
+  public final class ViewfinderSurfaceRequestUtil {
+    method @RequiresApi(21) public static androidx.camera.viewfinder.ViewfinderSurfaceRequest.Builder populateFromCharacteristics(androidx.camera.viewfinder.ViewfinderSurfaceRequest.Builder, android.hardware.camera2.CameraCharacteristics cameraCharacteristics);
+  }
+
 }
 
diff --git a/camera/camera-viewfinder/api/public_plus_experimental_1.1.0-beta03.txt b/camera/camera-viewfinder/api/public_plus_experimental_1.1.0-beta03.txt
deleted file mode 100644
index 69b776e..0000000
--- a/camera/camera-viewfinder/api/public_plus_experimental_1.1.0-beta03.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-// Signature format: 4.0
-package @androidx.camera.viewfinder.ExperimentalViewfinder androidx.camera.viewfinder {
-
-  @RequiresApi(21) public final class CameraViewfinder extends android.widget.FrameLayout {
-    ctor @UiThread public CameraViewfinder(android.content.Context);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int, int);
-    method @UiThread public android.graphics.Bitmap? getBitmap();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
-    method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
-    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
-    method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ImplementationMode {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode COMPATIBLE;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode PERFORMANCE;
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ScaleType {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_START;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_START;
-  }
-
-  @RequiresOptIn(level=androidx.annotation.RequiresOptIn.Level.ERROR) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalViewfinder {
-  }
-
-  @RequiresApi(21) public class ViewfinderSurfaceRequest {
-    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
-    method public android.util.Size getResolution();
-    method public int getSensorOrientation();
-    method public boolean isFrontCamera();
-    method public boolean isLegacyDevice();
-    method public void markSurfaceSafeToRelease();
-  }
-
-}
-
diff --git a/camera/camera-viewfinder/api/public_plus_experimental_1.1.0-beta04.txt b/camera/camera-viewfinder/api/public_plus_experimental_1.1.0-beta04.txt
deleted file mode 100644
index 69b776e..0000000
--- a/camera/camera-viewfinder/api/public_plus_experimental_1.1.0-beta04.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-// Signature format: 4.0
-package @androidx.camera.viewfinder.ExperimentalViewfinder androidx.camera.viewfinder {
-
-  @RequiresApi(21) public final class CameraViewfinder extends android.widget.FrameLayout {
-    ctor @UiThread public CameraViewfinder(android.content.Context);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int, int);
-    method @UiThread public android.graphics.Bitmap? getBitmap();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
-    method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
-    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
-    method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ImplementationMode {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode COMPATIBLE;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode PERFORMANCE;
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ScaleType {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_START;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_START;
-  }
-
-  @RequiresOptIn(level=androidx.annotation.RequiresOptIn.Level.ERROR) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalViewfinder {
-  }
-
-  @RequiresApi(21) public class ViewfinderSurfaceRequest {
-    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
-    method public android.util.Size getResolution();
-    method public int getSensorOrientation();
-    method public boolean isFrontCamera();
-    method public boolean isLegacyDevice();
-    method public void markSurfaceSafeToRelease();
-  }
-
-}
-
diff --git a/camera/camera-viewfinder/api/public_plus_experimental_1.2.0-beta01.txt b/camera/camera-viewfinder/api/public_plus_experimental_1.2.0-beta01.txt
deleted file mode 100644
index d452929..0000000
--- a/camera/camera-viewfinder/api/public_plus_experimental_1.2.0-beta01.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// Signature format: 4.0
-package androidx.camera.viewfinder {
-
-  @RequiresApi(21) public final class CameraViewfinder extends android.widget.FrameLayout {
-    ctor @UiThread public CameraViewfinder(android.content.Context);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int, int);
-    method @UiThread public android.graphics.Bitmap? getBitmap();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
-    method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
-    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
-    method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ImplementationMode {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode COMPATIBLE;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode PERFORMANCE;
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ScaleType {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_START;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_START;
-  }
-
-  @RequiresApi(21) public class ViewfinderSurfaceRequest {
-    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
-    method public android.util.Size getResolution();
-    method public int getSensorOrientation();
-    method public boolean isFrontCamera();
-    method public boolean isLegacyDevice();
-    method public void markSurfaceSafeToRelease();
-  }
-
-}
-
diff --git a/camera/camera-viewfinder/api/public_plus_experimental_1.2.0-beta02.txt b/camera/camera-viewfinder/api/public_plus_experimental_1.2.0-beta02.txt
deleted file mode 100644
index d452929..0000000
--- a/camera/camera-viewfinder/api/public_plus_experimental_1.2.0-beta02.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// Signature format: 4.0
-package androidx.camera.viewfinder {
-
-  @RequiresApi(21) public final class CameraViewfinder extends android.widget.FrameLayout {
-    ctor @UiThread public CameraViewfinder(android.content.Context);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int, int);
-    method @UiThread public android.graphics.Bitmap? getBitmap();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
-    method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
-    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
-    method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ImplementationMode {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode COMPATIBLE;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode PERFORMANCE;
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ScaleType {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_START;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_START;
-  }
-
-  @RequiresApi(21) public class ViewfinderSurfaceRequest {
-    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
-    method public android.util.Size getResolution();
-    method public int getSensorOrientation();
-    method public boolean isFrontCamera();
-    method public boolean isLegacyDevice();
-    method public void markSurfaceSafeToRelease();
-  }
-
-}
-
diff --git a/camera/camera-viewfinder/api/public_plus_experimental_1.2.0-beta03.txt b/camera/camera-viewfinder/api/public_plus_experimental_1.2.0-beta03.txt
index d452929..04cecbd 100644
--- a/camera/camera-viewfinder/api/public_plus_experimental_1.2.0-beta03.txt
+++ b/camera/camera-viewfinder/api/public_plus_experimental_1.2.0-beta03.txt
@@ -1,41 +1,2 @@
 // Signature format: 4.0
-package androidx.camera.viewfinder {
-
-  @RequiresApi(21) public final class CameraViewfinder extends android.widget.FrameLayout {
-    ctor @UiThread public CameraViewfinder(android.content.Context);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int, int);
-    method @UiThread public android.graphics.Bitmap? getBitmap();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
-    method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
-    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
-    method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ImplementationMode {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode COMPATIBLE;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode PERFORMANCE;
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ScaleType {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_START;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_START;
-  }
-
-  @RequiresApi(21) public class ViewfinderSurfaceRequest {
-    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
-    method public android.util.Size getResolution();
-    method public int getSensorOrientation();
-    method public boolean isFrontCamera();
-    method public boolean isLegacyDevice();
-    method public void markSurfaceSafeToRelease();
-  }
-
-}
 
diff --git a/camera/camera-viewfinder/api/public_plus_experimental_current.txt b/camera/camera-viewfinder/api/public_plus_experimental_current.txt
index d452929..0023b9c 100644
--- a/camera/camera-viewfinder/api/public_plus_experimental_current.txt
+++ b/camera/camera-viewfinder/api/public_plus_experimental_current.txt
@@ -10,7 +10,6 @@
     method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
     method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
     method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
-    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
     method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
   }
 
@@ -29,13 +28,24 @@
   }
 
   @RequiresApi(21) public class ViewfinderSurfaceRequest {
-    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
+    method public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode? getImplementationMode();
+    method public int getLensFacing();
     method public android.util.Size getResolution();
     method public int getSensorOrientation();
-    method public boolean isFrontCamera();
-    method public boolean isLegacyDevice();
     method public void markSurfaceSafeToRelease();
   }
 
+  public static final class ViewfinderSurfaceRequest.Builder {
+    ctor public ViewfinderSurfaceRequest.Builder(android.util.Size);
+    method public androidx.camera.viewfinder.ViewfinderSurfaceRequest build();
+    method public androidx.camera.viewfinder.ViewfinderSurfaceRequest.Builder setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
+    method public androidx.camera.viewfinder.ViewfinderSurfaceRequest.Builder setLensFacing(int);
+    method public androidx.camera.viewfinder.ViewfinderSurfaceRequest.Builder setSensorOrientation(int);
+  }
+
+  public final class ViewfinderSurfaceRequestUtil {
+    method @RequiresApi(21) public static androidx.camera.viewfinder.ViewfinderSurfaceRequest.Builder populateFromCharacteristics(androidx.camera.viewfinder.ViewfinderSurfaceRequest.Builder, android.hardware.camera2.CameraCharacteristics cameraCharacteristics);
+  }
+
 }
 
diff --git a/camera/camera-viewfinder/api/res-1.1.0-beta03.txt b/camera/camera-viewfinder/api/res-1.1.0-beta03.txt
deleted file mode 100644
index e69de29..0000000
--- a/camera/camera-viewfinder/api/res-1.1.0-beta03.txt
+++ /dev/null
diff --git a/camera/camera-viewfinder/api/res-1.1.0-beta04.txt b/camera/camera-viewfinder/api/res-1.1.0-beta04.txt
deleted file mode 100644
index e69de29..0000000
--- a/camera/camera-viewfinder/api/res-1.1.0-beta04.txt
+++ /dev/null
diff --git a/camera/camera-viewfinder/api/res-1.2.0-beta01.txt b/camera/camera-viewfinder/api/res-1.2.0-beta01.txt
deleted file mode 100644
index e69de29..0000000
--- a/camera/camera-viewfinder/api/res-1.2.0-beta01.txt
+++ /dev/null
diff --git a/camera/camera-viewfinder/api/res-1.2.0-beta02.txt b/camera/camera-viewfinder/api/res-1.2.0-beta02.txt
deleted file mode 100644
index e69de29..0000000
--- a/camera/camera-viewfinder/api/res-1.2.0-beta02.txt
+++ /dev/null
diff --git a/camera/camera-viewfinder/api/restricted_1.1.0-beta03.txt b/camera/camera-viewfinder/api/restricted_1.1.0-beta03.txt
deleted file mode 100644
index e6f50d0..0000000
--- a/camera/camera-viewfinder/api/restricted_1.1.0-beta03.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 4.0
diff --git a/camera/camera-viewfinder/api/restricted_1.1.0-beta04.txt b/camera/camera-viewfinder/api/restricted_1.1.0-beta04.txt
deleted file mode 100644
index e6f50d0..0000000
--- a/camera/camera-viewfinder/api/restricted_1.1.0-beta04.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 4.0
diff --git a/camera/camera-viewfinder/api/restricted_1.2.0-beta01.txt b/camera/camera-viewfinder/api/restricted_1.2.0-beta01.txt
deleted file mode 100644
index d452929..0000000
--- a/camera/camera-viewfinder/api/restricted_1.2.0-beta01.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// Signature format: 4.0
-package androidx.camera.viewfinder {
-
-  @RequiresApi(21) public final class CameraViewfinder extends android.widget.FrameLayout {
-    ctor @UiThread public CameraViewfinder(android.content.Context);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int, int);
-    method @UiThread public android.graphics.Bitmap? getBitmap();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
-    method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
-    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
-    method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ImplementationMode {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode COMPATIBLE;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode PERFORMANCE;
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ScaleType {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_START;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_START;
-  }
-
-  @RequiresApi(21) public class ViewfinderSurfaceRequest {
-    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
-    method public android.util.Size getResolution();
-    method public int getSensorOrientation();
-    method public boolean isFrontCamera();
-    method public boolean isLegacyDevice();
-    method public void markSurfaceSafeToRelease();
-  }
-
-}
-
diff --git a/camera/camera-viewfinder/api/restricted_1.2.0-beta02.txt b/camera/camera-viewfinder/api/restricted_1.2.0-beta02.txt
deleted file mode 100644
index d452929..0000000
--- a/camera/camera-viewfinder/api/restricted_1.2.0-beta02.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-// Signature format: 4.0
-package androidx.camera.viewfinder {
-
-  @RequiresApi(21) public final class CameraViewfinder extends android.widget.FrameLayout {
-    ctor @UiThread public CameraViewfinder(android.content.Context);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int, int);
-    method @UiThread public android.graphics.Bitmap? getBitmap();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
-    method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
-    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
-    method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ImplementationMode {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode COMPATIBLE;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode PERFORMANCE;
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ScaleType {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_START;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_START;
-  }
-
-  @RequiresApi(21) public class ViewfinderSurfaceRequest {
-    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
-    method public android.util.Size getResolution();
-    method public int getSensorOrientation();
-    method public boolean isFrontCamera();
-    method public boolean isLegacyDevice();
-    method public void markSurfaceSafeToRelease();
-  }
-
-}
-
diff --git a/camera/camera-viewfinder/api/restricted_1.2.0-beta03.txt b/camera/camera-viewfinder/api/restricted_1.2.0-beta03.txt
index d452929..04cecbd 100644
--- a/camera/camera-viewfinder/api/restricted_1.2.0-beta03.txt
+++ b/camera/camera-viewfinder/api/restricted_1.2.0-beta03.txt
@@ -1,41 +1,2 @@
 // Signature format: 4.0
-package androidx.camera.viewfinder {
-
-  @RequiresApi(21) public final class CameraViewfinder extends android.widget.FrameLayout {
-    ctor @UiThread public CameraViewfinder(android.content.Context);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int);
-    ctor @UiThread public CameraViewfinder(android.content.Context, android.util.AttributeSet?, int, int);
-    method @UiThread public android.graphics.Bitmap? getBitmap();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
-    method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
-    method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
-    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
-    method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ImplementationMode {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode COMPATIBLE;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ImplementationMode PERFORMANCE;
-  }
-
-  @RequiresApi(21) public enum CameraViewfinder.ScaleType {
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FILL_START;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_CENTER;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_END;
-    enum_constant public static final androidx.camera.viewfinder.CameraViewfinder.ScaleType FIT_START;
-  }
-
-  @RequiresApi(21) public class ViewfinderSurfaceRequest {
-    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
-    method public android.util.Size getResolution();
-    method public int getSensorOrientation();
-    method public boolean isFrontCamera();
-    method public boolean isLegacyDevice();
-    method public void markSurfaceSafeToRelease();
-  }
-
-}
 
diff --git a/camera/camera-viewfinder/api/restricted_current.txt b/camera/camera-viewfinder/api/restricted_current.txt
index d452929..0023b9c 100644
--- a/camera/camera-viewfinder/api/restricted_current.txt
+++ b/camera/camera-viewfinder/api/restricted_current.txt
@@ -10,7 +10,6 @@
     method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode getImplementationMode();
     method @UiThread public androidx.camera.viewfinder.CameraViewfinder.ScaleType getScaleType();
     method @UiThread public com.google.common.util.concurrent.ListenableFuture<android.view.Surface!> requestSurfaceAsync(androidx.camera.viewfinder.ViewfinderSurfaceRequest);
-    method @UiThread public void setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
     method @UiThread public void setScaleType(androidx.camera.viewfinder.CameraViewfinder.ScaleType);
   }
 
@@ -29,13 +28,24 @@
   }
 
   @RequiresApi(21) public class ViewfinderSurfaceRequest {
-    ctor public ViewfinderSurfaceRequest(android.util.Size, android.hardware.camera2.CameraCharacteristics);
+    method public androidx.camera.viewfinder.CameraViewfinder.ImplementationMode? getImplementationMode();
+    method public int getLensFacing();
     method public android.util.Size getResolution();
     method public int getSensorOrientation();
-    method public boolean isFrontCamera();
-    method public boolean isLegacyDevice();
     method public void markSurfaceSafeToRelease();
   }
 
+  public static final class ViewfinderSurfaceRequest.Builder {
+    ctor public ViewfinderSurfaceRequest.Builder(android.util.Size);
+    method public androidx.camera.viewfinder.ViewfinderSurfaceRequest build();
+    method public androidx.camera.viewfinder.ViewfinderSurfaceRequest.Builder setImplementationMode(androidx.camera.viewfinder.CameraViewfinder.ImplementationMode);
+    method public androidx.camera.viewfinder.ViewfinderSurfaceRequest.Builder setLensFacing(int);
+    method public androidx.camera.viewfinder.ViewfinderSurfaceRequest.Builder setSensorOrientation(int);
+  }
+
+  public final class ViewfinderSurfaceRequestUtil {
+    method @RequiresApi(21) public static androidx.camera.viewfinder.ViewfinderSurfaceRequest.Builder populateFromCharacteristics(androidx.camera.viewfinder.ViewfinderSurfaceRequest.Builder, android.hardware.camera2.CameraCharacteristics cameraCharacteristics);
+  }
+
 }
 
diff --git a/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/CameraViewfinderBitmapTest.kt b/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/CameraViewfinderBitmapTest.kt
index 67ea991..25b8313 100644
--- a/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/CameraViewfinderBitmapTest.kt
+++ b/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/CameraViewfinderBitmapTest.kt
@@ -21,8 +21,6 @@
 import android.hardware.camera2.CameraManager
 import android.util.Size
 import android.view.Surface
-import androidx.camera.viewfinder.CameraViewfinder.ImplementationMode.COMPATIBLE
-import androidx.camera.viewfinder.CameraViewfinder.ImplementationMode.PERFORMANCE
 import androidx.camera.viewfinder.CameraViewfinder.ScaleType.FILL_CENTER
 import androidx.camera.viewfinder.internal.utils.futures.FutureCallback
 import androidx.camera.viewfinder.internal.utils.futures.Futures
@@ -79,7 +77,9 @@
         Assume.assumeTrue("No cameras found on device.", cameraIds.isNotEmpty())
         val cameraId = cameraIds[0]
         val characteristics = cameraManager.getCameraCharacteristics(cameraId)
-        mSurfaceRequest = ViewfinderSurfaceRequest(ANY_SIZE, characteristics)
+        mSurfaceRequest = ViewfinderSurfaceRequest.Builder(ANY_SIZE)
+            .populateFromCharacteristics(characteristics)
+            .build()
     }
 
     @After
@@ -90,7 +90,7 @@
     @Throws(Throwable::class)
     fun bitmapNotNull_whenViewfinderIsDisplaying_surfaceView() {
         // Arrange
-        val viewfinder: CameraViewfinder = setUpViewfinder(PERFORMANCE, FILL_CENTER)
+        val viewfinder: CameraViewfinder = setUpViewfinder(FILL_CENTER)
 
         // assert
         runOnMainThread(Runnable {
@@ -119,7 +119,7 @@
     @Throws(Throwable::class)
     fun bitmapNotNull_whenViewfinderIsDisplaying_textureView() {
         // Arrange
-        val viewfinder: CameraViewfinder = setUpViewfinder(COMPATIBLE, FILL_CENTER)
+        val viewfinder: CameraViewfinder = setUpViewfinder(FILL_CENTER)
 
         // assert
         runOnMainThread(Runnable {
@@ -145,7 +145,6 @@
     }
 
     private fun setUpViewfinder(
-        mode: CameraViewfinder.ImplementationMode,
         scaleType: CameraViewfinder.ScaleType
     ): CameraViewfinder {
         val viewfinderAtomicReference: AtomicReference<CameraViewfinder> =
@@ -153,7 +152,6 @@
         runOnMainThread {
             val viewfiner =
                 CameraViewfinder(ApplicationProvider.getApplicationContext<Context>())
-            viewfiner.setImplementationMode(mode)
             viewfiner.setScaleType(scaleType)
             mActivityRule.getScenario().onActivity(
                 ActivityAction<FakeActivity> { activity: FakeActivity ->
diff --git a/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/SurfaceViewImplementationTest.kt b/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/SurfaceViewImplementationTest.kt
index 16e57c2..7e0012c 100644
--- a/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/SurfaceViewImplementationTest.kt
+++ b/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/SurfaceViewImplementationTest.kt
@@ -72,7 +72,9 @@
         Assume.assumeTrue("No cameras found on device.", cameraIds.isNotEmpty())
         val cameraId = cameraIds[0]
         val characteristics = cameraManager.getCameraCharacteristics(cameraId)
-        mSurfaceRequest = ViewfinderSurfaceRequest(ANY_SIZE, characteristics)
+        mSurfaceRequest = ViewfinderSurfaceRequest.Builder(ANY_SIZE)
+            .populateFromCharacteristics(characteristics)
+            .build()
         mImplementation = SurfaceViewImplementation(mParent, ViewfinderTransformation())
     }
 
diff --git a/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/TextureViewImplementationTest.kt b/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/TextureViewImplementationTest.kt
index 3b6bae6..dbb8587 100644
--- a/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/TextureViewImplementationTest.kt
+++ b/camera/camera-viewfinder/src/androidTest/java/androidx/camera/viewfinder/TextureViewImplementationTest.kt
@@ -56,7 +56,9 @@
                 val cameraId = cameraIds[0]
                 val characteristics = cameraManager.getCameraCharacteristics(cameraId)
                 _surfaceRequest =
-                    ViewfinderSurfaceRequest(ANY_SIZE, characteristics)
+                    ViewfinderSurfaceRequest.Builder(ANY_SIZE)
+                        .populateFromCharacteristics(characteristics)
+                        .build()
             }
             return _surfaceRequest!!
         }
diff --git a/camera/camera-viewfinder/src/main/java/androidx/camera/viewfinder/CameraViewfinder.java b/camera/camera-viewfinder/src/main/java/androidx/camera/viewfinder/CameraViewfinder.java
index 03c4488..9a438c0 100644
--- a/camera/camera-viewfinder/src/main/java/androidx/camera/viewfinder/CameraViewfinder.java
+++ b/camera/camera-viewfinder/src/main/java/androidx/camera/viewfinder/CameraViewfinder.java
@@ -41,6 +41,7 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.annotation.UiThread;
+import androidx.annotation.VisibleForTesting;
 import androidx.camera.viewfinder.internal.quirk.DeviceQuirks;
 import androidx.camera.viewfinder.internal.quirk.SurfaceViewNotCroppedByParentQuirk;
 import androidx.camera.viewfinder.internal.quirk.SurfaceViewStretchedQuirk;
@@ -79,7 +80,7 @@
     @NonNull
     private final Looper mRequiredLooper = Looper.myLooper();
 
-    @NonNull ImplementationMode mImplementationMode = DEFAULT_IMPL_MODE;
+    @NonNull ImplementationMode mImplementationMode;
 
     // Synthetic access
     @SuppressWarnings("WeakerAccess")
@@ -116,8 +117,11 @@
             }
             Logger.d(TAG, "Surface requested by Viewfinder.");
 
-            mImplementation = shouldUseTextureView(
-                    surfaceRequest.isLegacyDevice(), mImplementationMode)
+            if (surfaceRequest.getImplementationMode() != null) {
+                mImplementationMode = surfaceRequest.getImplementationMode();
+            }
+
+            mImplementation = shouldUseTextureView(mImplementationMode)
                     ? new TextureViewImplementation(
                             CameraViewfinder.this, mViewfinderTransformation)
                     : new SurfaceViewImplementation(
@@ -130,10 +134,12 @@
                 mViewfinderTransformation.setTransformationInfo(
                         createTransformInfo(surfaceRequest.getResolution(),
                                 display,
-                                surfaceRequest.isFrontCamera(),
+                                surfaceRequest.getLensFacing()
+                                        == CameraCharacteristics.LENS_FACING_FRONT,
                                 surfaceRequest.getSensorOrientation()),
                         surfaceRequest.getResolution(),
-                        surfaceRequest.isFrontCamera());
+                        surfaceRequest.getLensFacing()
+                                == CameraCharacteristics.LENS_FACING_FRONT);
                 redrawViewfinder();
             }
         }
@@ -176,7 +182,7 @@
             int implementationModeId =
                     attributes.getInteger(R.styleable.Viewfinder_implementationMode,
                             DEFAULT_IMPL_MODE.getId());
-            setImplementationMode(ImplementationMode.fromId(implementationModeId));
+            mImplementationMode = ImplementationMode.fromId(implementationModeId);
         } finally {
             attributes.recycle();
         }
@@ -189,36 +195,15 @@
     }
 
     /**
-     * Sets the {@link ImplementationMode} for the {@link CameraViewfinder}.
-     *
-     * <p> This value can also be set in the layout XML file via the {@code app:implementationMode}
-     * attribute.
-     *
-     * <p> {@link CameraViewfinder} displays the viewfinder with a {@link TextureView} when the
-     * mode is {@link ImplementationMode#COMPATIBLE}, and tries to use a {@link SurfaceView} if
-     * it is {@link ImplementationMode#PERFORMANCE} when possible, which depends on the device's
-     * attributes (e.g. API level). If not set, the default mode is
-     * {@link ImplementationMode#PERFORMANCE}.
-     *
-     * <p> This method should be called after {@link CameraViewfinder} is inflated and before
-     * {@link CameraViewfinder#requestSurfaceAsync(ViewfinderSurfaceRequest)}. If a new
-     * {@link ImplementationMode} is set, the capture session needs to be recreated and new
-     * surface request needs to be sent to make it effective.
-     *
-     * @param implementationMode The {@link ImplementationMode} to apply to the viewfinder.
-     * @attr name app:implementationMode
-     */
-    @UiThread
-    public void setImplementationMode(@NonNull final ImplementationMode implementationMode) {
-        checkUiThread();
-        mImplementationMode = implementationMode;
-    }
-
-    /**
      * Returns the {@link ImplementationMode}.
      *
-     * <p> If nothing is set via {@link #setImplementationMode}, the default
-     * value is {@link ImplementationMode#PERFORMANCE}.
+     * <p> For each {@link ViewfinderSurfaceRequest} sent to {@link CameraViewfinder}, the
+     * {@link ImplementationMode} set in the {@link ViewfinderSurfaceRequest} will be used first.
+     * If it's not set, the {@code app:implementationMode} in the layout xml will be used. If
+     * it's not set in the layout xml, the default value {@link ImplementationMode#PERFORMANCE}
+     * will be used. Each {@link ViewfinderSurfaceRequest sent to {@link CameraViewfinder} can
+     * override the {@link ImplementationMode} once it has set the
+     * {@link ImplementationMode}.
      *
      * @return The {@link ImplementationMode} for {@link CameraViewfinder}.
      */
@@ -376,16 +361,15 @@
         stopListeningToDisplayChange();
     }
 
-    // Synthetic access
-    @SuppressWarnings("WeakerAccess")
-    static boolean shouldUseTextureView(
-            boolean isLegacyDevice,
-            @NonNull final ImplementationMode implementationMode) {
+    @VisibleForTesting
+    static boolean shouldUseTextureView(@NonNull final ImplementationMode implementationMode) {
         boolean hasSurfaceViewQuirk = DeviceQuirks.get(SurfaceViewStretchedQuirk.class) != null
                 ||  DeviceQuirks.get(SurfaceViewNotCroppedByParentQuirk.class) != null;
-        if (Build.VERSION.SDK_INT <= 24 || isLegacyDevice || hasSurfaceViewQuirk) {
+        if (Build.VERSION.SDK_INT <= 24 || hasSurfaceViewQuirk) {
             // Force to use TextureView when the device is running android 7.0 and below, legacy
             // level or SurfaceView has quirks.
+            Logger.d(TAG, "Implementation mode to set is not supported, forcing to use "
+                    + "TextureView, because transform APIs are not supported on these devices.");
             return true;
         }
         switch (implementationMode) {
@@ -624,7 +608,8 @@
                     mViewfinderTransformation.updateTransformInfo(
                             createTransformInfo(surfaceRequest.getResolution(),
                                     display,
-                                    surfaceRequest.isFrontCamera(),
+                                    surfaceRequest.getLensFacing()
+                                            == CameraCharacteristics.LENS_FACING_FRONT,
                                     surfaceRequest.getSensorOrientation()));
                     redrawViewfinder();
                 }
diff --git a/camera/camera-viewfinder/src/main/java/androidx/camera/viewfinder/ViewfinderSurfaceRequest.java b/camera/camera-viewfinder/src/main/java/androidx/camera/viewfinder/ViewfinderSurfaceRequest.java
index e0eb047..b23887a8 100644
--- a/camera/camera-viewfinder/src/main/java/androidx/camera/viewfinder/ViewfinderSurfaceRequest.java
+++ b/camera/camera-viewfinder/src/main/java/androidx/camera/viewfinder/ViewfinderSurfaceRequest.java
@@ -16,6 +16,10 @@
 
 package androidx.camera.viewfinder;
 
+import static android.hardware.camera2.CameraMetadata.LENS_FACING_BACK;
+import static android.hardware.camera2.CameraMetadata.LENS_FACING_EXTERNAL;
+import static android.hardware.camera2.CameraMetadata.LENS_FACING_FRONT;
+
 import android.annotation.SuppressLint;
 import android.graphics.SurfaceTexture;
 import android.hardware.camera2.CameraCharacteristics;
@@ -31,6 +35,7 @@
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
+import androidx.camera.viewfinder.CameraViewfinder.ImplementationMode;
 import androidx.camera.viewfinder.internal.surface.ViewfinderSurface;
 import androidx.camera.viewfinder.internal.utils.Logger;
 import androidx.camera.viewfinder.internal.utils.executor.CameraExecutors;
@@ -68,62 +73,39 @@
 
     private static final String TAG = "ViewfinderSurfaceRequest";
 
-    private final boolean mIsLegacyDevice;
-    private final boolean mIsFrontCamera;
-    private final int mSensorOrientation;
     @NonNull private final Size mResolution;
     @NonNull private final ViewfinderSurface mInternalViewfinderSurface;
     @NonNull private final CallbackToFutureAdapter.Completer<Void> mRequestCancellationCompleter;
     @NonNull private final ListenableFuture<Void> mSessionStatusFuture;
     @NonNull private final CallbackToFutureAdapter.Completer<Surface> mSurfaceCompleter;
-
+    @LensFacingValue private int mLensFacing;
+    @SensorOrientationDegreesValue private int mSensorOrientation;
+    @Nullable
+    private ImplementationMode mImplementationMode;
     @SuppressWarnings("WeakerAccess") /*synthetic accessor */
     @NonNull
     final ListenableFuture<Surface> mSurfaceFuture;
 
     /**
-     * Creates a new surface request with surface resolution and camera characteristics.
-     *
-     * <p>The resolution given here will be the default resolution of the Surface returned by
-     * {@link CameraViewfinder#requestSurfaceAsync(ViewfinderSurfaceRequest)}, which can then be
-     * passed to the camera API to set the camera viewfinder resolution.
-     *
-     * @param resolution The requested surface resolution.
-     * @param cameraCharacteristics The {@link CameraCharacteristics} to get device information
-     *                              e.g. hardware level, lens facing, sensor orientation, etc,.
-     */
-    public ViewfinderSurfaceRequest(
-            @NonNull Size resolution,
-            @NonNull CameraCharacteristics cameraCharacteristics) {
-        this(resolution,
-                cameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)
-                        == CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY,
-                cameraCharacteristics.get(CameraCharacteristics.LENS_FACING)
-                        == CameraCharacteristics.LENS_FACING_FRONT,
-                cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION));
-    }
-
-    /**
-     * Creates a new surface request with surface resolution, view display and camera device
-     * information.
+     * Creates a new surface request with surface resolution, camera device, lens facing and
+     * sensor orientation information.
      *
      * @param resolution The requested surface resolution. It is the output surface size
      *                   the camera is configured with, instead of {@link CameraViewfinder}
      *                   view size.
-     * {@link CameraViewfinder} view
-     * @param isLegacyDevice The device hardware level is legacy or not.
-     * @param isFrontCamera The camera is front facing or not.
+     * @param lensFacing The camera lens facing.
      * @param sensorOrientation THe camera sensor orientation.
+     * @param implementationMode The {@link ImplementationMode} to apply to the viewfinder.
      */
-    private ViewfinderSurfaceRequest(
+    ViewfinderSurfaceRequest(
             @NonNull Size resolution,
-            boolean isLegacyDevice,
-            boolean isFrontCamera,
-            int sensorOrientation) {
+            @LensFacingValue int lensFacing,
+            @SensorOrientationDegreesValue int sensorOrientation,
+            @Nullable ImplementationMode implementationMode) {
         mResolution = resolution;
-        mIsLegacyDevice = isLegacyDevice;
-        mIsFrontCamera = isFrontCamera;
+        mLensFacing = lensFacing;
         mSensorOrientation = sensorOrientation;
+        mImplementationMode = implementationMode;
 
         // To ensure concurrency and ordering, operations are chained. Completion can only be
         // triggered externally by the top-level completer (mSurfaceCompleter). The other future
@@ -164,7 +146,7 @@
             }
 
             @Override
-            public void onFailure(Throwable t) {
+            public void onFailure(@NonNull Throwable t) {
                 if (t instanceof RequestCancelledException) {
                     // Cancellation occurred. Notify listeners.
                     Preconditions.checkState(requestCancellationFuture.cancel(false));
@@ -259,6 +241,8 @@
     /**
      * Returns the resolution of the requested {@link Surface}.
      *
+     * <p>The value is set by {@link Builder#Builder(Size)}.
+     *
      * The surface which fulfills this request must have the resolution specified here in
      * order to fulfill the resource requirements of the camera.
      *
@@ -273,28 +257,40 @@
     /**
      * Returns the sensor orientation.
      *
+     * <p>The value is set by {@link Builder#setSensorOrientation(int)}, which can be retrieved from
+     * {@link CameraCharacteristics} by key {@link CameraCharacteristics#SENSOR_ORIENTATION}.
+     *
      * @return The sensor orientation.
      */
+    @SensorOrientationDegreesValue
     public int getSensorOrientation() {
         return mSensorOrientation;
     }
 
     /**
-     * Returns the status of camera lens facing.
+     * Returns the camera lens facing.
      *
-     * @return True if front camera, otherwise false.
+     * <p>The value is set by {@link Builder#setLensFacing(int)}, which can be retrieved from
+     * {@link CameraCharacteristics} by key {@link CameraCharacteristics#LENS_FACING}.
+     *
+     * @return The lens facing.
      */
-    public boolean isFrontCamera() {
-        return mIsFrontCamera;
+    @LensFacingValue
+    public int getLensFacing() {
+        return mLensFacing;
     }
 
     /**
-     * Returns the status of camera hardware level.
+     * Returns the {@link ImplementationMode}.
      *
-     * @return True if legacy device, otherwise false.
+     * <p>The value is set by {@link Builder#setImplementationMode(ImplementationMode)}.
+     *
+     * @return {@link ImplementationMode}. The value will be null if it's not set via
+     * {@link Builder#setImplementationMode(ImplementationMode)}.
      */
-    public boolean isLegacyDevice() {
-        return mIsLegacyDevice;
+    @Nullable
+    public ImplementationMode getImplementationMode() {
+        return mImplementationMode;
     }
 
     /**
@@ -362,7 +358,7 @@
                 }
 
                 @Override
-                public void onFailure(Throwable t) {
+                public void onFailure(@NonNull Throwable t) {
                     Preconditions.checkState(t instanceof RequestCancelledException, "Camera "
                             + "surface session should only fail with request "
                             + "cancellation. Instead failed due to:\n" + t);
@@ -414,6 +410,114 @@
                         + "will not complete."));
     }
 
+    /**
+     * Builder for {@link ViewfinderSurfaceRequest}.
+     */
+    public static final class Builder {
+
+        @NonNull private final Size mResolution;
+        @LensFacingValue private int mLensFacing = LENS_FACING_BACK;
+        @SensorOrientationDegreesValue private int mSensorOrientation = 0;
+        @Nullable private ImplementationMode mImplementationMode;
+
+        public Builder(@NonNull Size resolution) {
+            mResolution = resolution;
+        }
+
+        /**
+         * Sets the {@link ImplementationMode}.
+         *
+         * <p><b>Possible values:</b></p>
+         * <ul>
+         *   <li>{@link ImplementationMode#PERFORMANCE PERFORMANCE}</li>
+         *   <li>{@link ImplementationMode#COMPATIBLE COMPATIBLE}</li>
+         * </ul>
+         *
+         * <p>If not set, the {@link ImplementationMode} set via {@code app:implementationMode} in
+         * layout xml will be used for {@link CameraViewfinder}. If not set in the layout xml,
+         * the default value {@link ImplementationMode#PERFORMANCE} will be used in
+         * {@link CameraViewfinder}.
+         *
+         * @param implementationMode The {@link ImplementationMode}.
+         * @return This builder.
+         */
+        @NonNull
+        public Builder setImplementationMode(@NonNull ImplementationMode implementationMode) {
+            mImplementationMode = implementationMode;
+            return this;
+        }
+
+        /**
+         * Sets the lens facing.
+         *
+         * <p><b>Possible values:</b></p>
+         * <ul>
+         *   <li>{@link CameraMetadata#LENS_FACING_FRONT FRONT}</li>
+         *   <li>{@link CameraMetadata#LENS_FACING_BACK BACK}</li>
+         *   <li>{@link CameraMetadata#LENS_FACING_EXTERNAL EXTERNAL}</li>
+         * </ul>
+         *
+         * <p>The value can be retrieved from {@link CameraCharacteristics} by key
+         * {@link CameraCharacteristics#LENS_FACING}. If not set,
+         * {@link CameraMetadata#LENS_FACING_BACK} will be used by default.
+         *
+         * @param lensFacing The lens facing.
+         * @return This builder.
+         */
+        @NonNull
+        public Builder setLensFacing(@LensFacingValue int lensFacing) {
+            mLensFacing = lensFacing;
+            return this;
+        }
+
+        /**
+         * Sets the sensor orientation.
+         *
+         * <p><b>Range of valid values:</b><br>
+         * 0, 90, 180, 270</p>
+         *
+         * <p>The value can be retrieved from {@link CameraCharacteristics} by key
+         * {@link CameraCharacteristics#SENSOR_ORIENTATION}. If it is not
+         * set, 0 will be used by default.
+         *
+         * @param sensorOrientation
+         * @return this builder.
+         */
+        @NonNull
+        public Builder setSensorOrientation(@SensorOrientationDegreesValue int sensorOrientation) {
+            mSensorOrientation = sensorOrientation;
+            return this;
+        }
+
+        /**
+         * Builds the {@link ViewfinderSurfaceRequest}.
+         * @return the instance of {@link ViewfinderSurfaceRequest}.
+         */
+        @NonNull
+        public ViewfinderSurfaceRequest build() {
+            if (mLensFacing != LENS_FACING_FRONT
+                    && mLensFacing != LENS_FACING_BACK
+                    && mLensFacing != LENS_FACING_EXTERNAL) {
+                throw new IllegalArgumentException("Lens facing value: " + mLensFacing + " is "
+                        + "invalid");
+            }
+
+            if (mSensorOrientation != 0
+                    && mSensorOrientation != 90
+                    && mSensorOrientation != 180
+                    && mSensorOrientation != 270) {
+                throw new IllegalArgumentException("Sensor orientation value: "
+                        + mSensorOrientation + " is invalid");
+            }
+
+            return new ViewfinderSurfaceRequest(
+                    mResolution,
+                    mLensFacing,
+                    mSensorOrientation,
+                    mImplementationMode);
+        }
+    }
+
     static final class RequestCancelledException extends RuntimeException {
         RequestCancelledException(@NonNull String message, @NonNull Throwable cause) {
             super(message, cause);
@@ -541,4 +645,20 @@
         Result() {
         }
     }
+
+    /**
+     * Valid integer sensor orientation degrees values.
+     */
+    @IntDef({0, 90, 180, 270})
+    @Retention(RetentionPolicy.SOURCE)
+    @interface SensorOrientationDegreesValue {
+    }
+
+    /**
+     * Valid integer sensor orientation degrees values.
+     */
+    @IntDef({LENS_FACING_FRONT, LENS_FACING_BACK, LENS_FACING_EXTERNAL})
+    @Retention(RetentionPolicy.SOURCE)
+    @interface LensFacingValue {
+    }
 }
diff --git a/camera/camera-viewfinder/src/main/java/androidx/camera/viewfinder/ViewfinderSurfaceRequestExt.kt b/camera/camera-viewfinder/src/main/java/androidx/camera/viewfinder/ViewfinderSurfaceRequestExt.kt
new file mode 100644
index 0000000..4b8112e
--- /dev/null
+++ b/camera/camera-viewfinder/src/main/java/androidx/camera/viewfinder/ViewfinderSurfaceRequestExt.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+@file:JvmName("ViewfinderSurfaceRequestUtil")
+
+package androidx.camera.viewfinder
+
+import android.annotation.SuppressLint
+import android.hardware.camera2.CameraCharacteristics
+import android.hardware.camera2.CameraMetadata
+import androidx.annotation.RequiresApi
+import androidx.camera.viewfinder.CameraViewfinder.ImplementationMode
+
+/**
+ * Populates [ViewfinderSurfaceRequest.Builder] from [CameraCharacteristics].
+ *
+ * <p>The [CameraCharacteristics] will be used to populate information including lens facing,
+ * sensor orientation and [ImplementationMode]. If the hardware level is legacy,
+ * the [ImplementationMode] will be set to [ImplementationMode.COMPATIBLE].
+ */
+@SuppressLint("ClassVerificationFailure")
+@RequiresApi(21)
+fun ViewfinderSurfaceRequest.Builder.populateFromCharacteristics(
+    cameraCharacteristics: CameraCharacteristics
+): ViewfinderSurfaceRequest.Builder {
+    setLensFacing(cameraCharacteristics.get(CameraCharacteristics.LENS_FACING)!!)
+    setSensorOrientation(
+        cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION)!!)
+    if (cameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)
+        == CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) {
+        setImplementationMode(ImplementationMode.COMPATIBLE)
+    }
+    return this
+}
\ No newline at end of file
diff --git a/camera/camera-viewfinder/src/test/java/androidx/camera/viewfinder/CameraViewfinderTest.java b/camera/camera-viewfinder/src/test/java/androidx/camera/viewfinder/CameraViewfinderTest.java
index 897fcde0..2528c8d 100644
--- a/camera/camera-viewfinder/src/test/java/androidx/camera/viewfinder/CameraViewfinderTest.java
+++ b/camera/camera-viewfinder/src/test/java/androidx/camera/viewfinder/CameraViewfinderTest.java
@@ -46,7 +46,6 @@
     public void surfaceViewNormal_useSurfaceView() {
         // Assert: SurfaceView is used.
         assertThat(CameraViewfinder.shouldUseTextureView(
-                /* isLegacyDevice = */ false,
                 CameraViewfinder.ImplementationMode.PERFORMANCE)).isFalse();
     }
 
@@ -57,7 +56,6 @@
 
         // Assert: TextureView is used even the SurfaceRequest is compatible with SurfaceView.
         assertThat(CameraViewfinder.shouldUseTextureView(
-                /* isLegacyDevice = */ false,
                 CameraViewfinder.ImplementationMode.PERFORMANCE)).isTrue();
     }
 
@@ -68,7 +66,6 @@
 
         // Assert: TextureView is used even the SurfaceRequest is compatible with SurfaceView.
         assertThat(CameraViewfinder.shouldUseTextureView(
-                /* isLegacyDevice = */ false,
                 CameraViewfinder.ImplementationMode.PERFORMANCE)).isTrue();
     }
 
@@ -79,7 +76,6 @@
 
         // Assert: TextureView is used even the SurfaceRequest is compatible with SurfaceView.
         assertThat(CameraViewfinder.shouldUseTextureView(
-                /* isLegacyDevice = */ true,
                 CameraViewfinder.ImplementationMode.COMPATIBLE)).isTrue();
     }
 }
diff --git a/camera/integration-tests/viewfindertestapp/src/main/java/androidx/camera/integration/viewfinder/CameraViewfinderFoldableFragment.kt b/camera/integration-tests/viewfindertestapp/src/main/java/androidx/camera/integration/viewfinder/CameraViewfinderFoldableFragment.kt
index 22a0b7c..04b25e4 100644
--- a/camera/integration-tests/viewfindertestapp/src/main/java/androidx/camera/integration/viewfinder/CameraViewfinderFoldableFragment.kt
+++ b/camera/integration-tests/viewfindertestapp/src/main/java/androidx/camera/integration/viewfinder/CameraViewfinderFoldableFragment.kt
@@ -45,6 +45,7 @@
 import android.os.HandlerThread
 import android.provider.MediaStore
 import android.util.Log
+import android.util.Size
 import android.view.LayoutInflater
 import android.view.Menu
 import android.view.MenuInflater
@@ -59,6 +60,7 @@
 import androidx.camera.core.impl.utils.futures.Futures
 import androidx.camera.viewfinder.CameraViewfinder
 import androidx.camera.viewfinder.ViewfinderSurfaceRequest
+import androidx.camera.viewfinder.populateFromCharacteristics
 import androidx.core.app.ActivityCompat
 import androidx.core.content.ContextCompat
 import androidx.fragment.app.DialogFragment
@@ -76,7 +78,6 @@
 import java.io.FileOutputStream
 import java.io.IOException
 import java.text.SimpleDateFormat
-import java.util.Arrays
 import java.util.Collections
 import java.util.Date
 import java.util.Locale
@@ -144,6 +145,8 @@
 
     private var viewfinderSurfaceRequest: ViewfinderSurfaceRequest? = null
 
+    private var resolution: Size? = null
+
     @Deprecated("Deprecated in Java")
     @Suppress("DEPRECATION")
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -171,14 +174,18 @@
     override fun onOptionsItemSelected(item: MenuItem): Boolean {
         when (item.itemId) {
             R.id.implementationMode -> {
-                cameraViewfinder.implementationMode =
+                val implementationMode =
                     when (cameraViewfinder.implementationMode) {
                         CameraViewfinder.ImplementationMode.PERFORMANCE ->
                             CameraViewfinder.ImplementationMode.COMPATIBLE
                         else -> CameraViewfinder.ImplementationMode.PERFORMANCE
                     }
-                closeCamera()
-                sendSurfaceRequest(false)
+
+                val viewfinderSurfaceRequest = ViewfinderSurfaceRequest.Builder(resolution!!)
+                    .populateFromCharacteristics(characteristics)
+                    .setImplementationMode(implementationMode)
+                    .build()
+                sendSurfaceRequest(viewfinderSurfaceRequest)
             }
             R.id.fitCenter -> cameraViewfinder.scaleType = CameraViewfinder.ScaleType.FIT_CENTER
             R.id.fillCenter -> cameraViewfinder.scaleType = CameraViewfinder.ScaleType.FILL_CENTER
@@ -234,7 +241,12 @@
             }
         }
 
-        sendSurfaceRequest(false)
+        setUpCameraOutputs(false)
+
+        val viewfinderSurfaceRequest = ViewfinderSurfaceRequest.Builder(resolution!!)
+            .populateFromCharacteristics(characteristics)
+            .build()
+        sendSurfaceRequest(viewfinderSurfaceRequest)
 
         lifecycleScope.launch {
             windowInfoTracker.windowLayoutInfo(requireActivity())
@@ -302,14 +314,13 @@
     }
 
     // ------------- Create Capture Session --------------
-    private fun sendSurfaceRequest(toggleCamera: Boolean) {
+    private fun sendSurfaceRequest(request: ViewfinderSurfaceRequest) {
         cameraViewfinder.post {
             if (isAdded && context != null) {
-                setUpCameraOutputs(toggleCamera)
-
                 val context = requireContext()
+                this.viewfinderSurfaceRequest = request
                 surfaceListenableFuture =
-                    cameraViewfinder.requestSurfaceAsync(viewfinderSurfaceRequest!!)
+                    cameraViewfinder.requestSurfaceAsync(request)
 
                 Futures.addCallback(surfaceListenableFuture, object : FutureCallback<Surface?> {
                     override fun onSuccess(surface: Surface?) {
@@ -353,12 +364,12 @@
                 ) ?: continue
 
                 // For still image captures, we use the largest available size.
-                val largest = Collections.max(
-                    /* coll = */ Arrays.asList(*map.getOutputSizes(ImageFormat.JPEG)),
+                resolution = Collections.max(
+                    /* coll = */ listOf(*map.getOutputSizes(ImageFormat.JPEG)),
                     /* comp = */ CompareSizesByArea()
                 )
                 imageReader = ImageReader.newInstance(
-                    largest.width, largest.height,
+                    resolution!!.width, resolution!!.height,
                     ImageFormat.JPEG, /*maxImages*/ 2
                 ).apply {
                     setOnImageAvailableListener(onImageAvailableListener, imageReaderHandler)
@@ -366,9 +377,6 @@
 
                 this.cameraId = cameraId
                 this.characteristics = cameraManager.getCameraCharacteristics(cameraId)
-                viewfinderSurfaceRequest = ViewfinderSurfaceRequest(largest, characteristics)
-
-                Log.d(TAG, "viewfinderSurfaceRequest created = $viewfinderSurfaceRequest")
                 return
             }
         } catch (e: CameraAccessException) {
@@ -488,7 +496,11 @@
     // ------------- Toggle Camera -----------
     private fun toggleCamera() {
         closeCamera()
-        sendSurfaceRequest(true)
+        setUpCameraOutputs(true)
+        val viewfinderSurfaceRequest = ViewfinderSurfaceRequest.Builder(resolution!!)
+            .populateFromCharacteristics(characteristics)
+            .build()
+        sendSurfaceRequest(viewfinderSurfaceRequest)
     }
 
     // ------------- Save Bitmap ------------