Clean up internal interface CameraFactory#getIdForLensFacing.

  In favor of using CameraSelector to get camera and its infomation.
  The interface of getting camera id with lens facing becomes
  unnecessary. So remove it and keep CameraFactory only for creating
  cameras.
  Remove CameraX#getCameraWithLensFacing.
  Remove unused code in CameraExtensionsActivity.

Bug: b/146101016
Test: ./gradlew bOS
Change-Id: I4bf518d48fdb21dc7a63a3d29130664f987a0adb
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java
index 905162d..342e15e 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java
@@ -22,9 +22,7 @@
 import android.Manifest;
 import android.app.Instrumentation;
 import android.content.Context;
-import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCharacteristics;
-import android.hardware.camera2.CameraManager;
 
 import androidx.camera.core.Camera;
 import androidx.camera.core.CameraInfoUnavailableException;
@@ -37,6 +35,7 @@
 import androidx.camera.core.MeteringPoint;
 import androidx.camera.core.SurfaceOrientedMeteringPointFactory;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
+import androidx.camera.testing.CameraUtil;
 import androidx.camera.testing.fakes.FakeLifecycleOwner;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.filters.LargeTest;
@@ -110,19 +109,15 @@
         });
     }
 
-    private static CameraCharacteristics getCameraCharacteristic(CameraSelector cameraSelector)
-            throws CameraInfoUnavailableException, CameraAccessException {
-        String cameraId = CameraX.getCameraWithLensFacing(cameraSelector.getLensFacing());
-        CameraManager cameraManager =
-                (CameraManager) ApplicationProvider.getApplicationContext().getSystemService(
-                        Context.CAMERA_SERVICE);
-
-        return cameraManager.getCameraCharacteristics(cameraId);
+    private static CameraCharacteristics getCameraCharacteristicWithLensFacing(
+            @CameraSelector.LensFacing int lensFacing) {
+        return CameraUtil.getCameraCharacteristics(lensFacing);
     }
 
     private static boolean isSupportAeRegion(CameraSelector cameraSelector) {
         try {
-            CameraCharacteristics characteristics = getCameraCharacteristic(cameraSelector);
+            CameraCharacteristics characteristics = getCameraCharacteristicWithLensFacing(
+                    cameraSelector.getLensFacing());
             return characteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AE) > 0;
         } catch (Exception e) {
             return false;
@@ -131,7 +126,8 @@
 
     private static boolean isSupportAwbRegion(CameraSelector cameraSelector) {
         try {
-            CameraCharacteristics characteristics = getCameraCharacteristic(cameraSelector);
+            CameraCharacteristics characteristics = getCameraCharacteristicWithLensFacing(
+                    cameraSelector.getLensFacing());
             return characteristics.get(CameraCharacteristics.CONTROL_MAX_REGIONS_AWB) > 0;
         } catch (Exception e) {
             return false;
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageAnalysisTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageAnalysisTest.java
index c9ae4cb..947d8c1 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageAnalysisTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageAnalysisTest.java
@@ -138,9 +138,9 @@
 
             // Checks camera device sensor degrees to set correct target rotation value to make sure
             // the exactly matching result size 640x480 can be selected if the device supports it.
-            String cameraId = CameraX.getCameraFactory().cameraIdForLensFacing(lensFacing);
-            boolean isRotateNeeded = (CameraX.getCameraInfo(cameraId).getSensorRotationDegrees(
-                    Surface.ROTATION_0) % 180) != 0;
+            Integer sensorOrientation = CameraUtil.getSensorOrientation(
+                    CameraSelector.LENS_FACING_BACK);
+            boolean isRotateNeeded = (sensorOrientation % 180) != 0;
             ImageAnalysis useCase = new ImageAnalysis.Builder().setTargetResolution(
                     GUARANTEED_RESOLUTION).setTargetRotation(
                     isRotateNeeded ? Surface.ROTATION_90 : Surface.ROTATION_0).build();
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java
index ccc15be..daaba27 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/ImageCaptureTest.java
@@ -35,7 +35,6 @@
 import android.content.Context;
 import android.graphics.ImageFormat;
 import android.graphics.Rect;
-import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCaptureSession;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CaptureRequest;
@@ -53,11 +52,9 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.experimental.UseExperimental;
 import androidx.camera.camera2.internal.util.FakeRepeatingUseCase;
-import androidx.camera.camera2.interop.Camera2CameraInfo;
 import androidx.camera.camera2.interop.Camera2Interop;
 import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
 import androidx.camera.core.AspectRatio;
-import androidx.camera.core.Camera;
 import androidx.camera.core.CameraInfoUnavailableException;
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.CameraX;
@@ -74,6 +71,7 @@
 import androidx.camera.core.impl.CaptureStage;
 import androidx.camera.core.impl.ImageCaptureConfig;
 import androidx.camera.core.impl.ImageOutputConfig;
+import androidx.camera.core.impl.utils.CameraOrientationUtil;
 import androidx.camera.core.impl.utils.Exif;
 import androidx.camera.testing.CameraUtil;
 import androidx.camera.testing.fakes.FakeCaptureStage;
@@ -129,35 +127,15 @@
     private ImageCapture.Builder mDefaultBuilder;
     private FakeRepeatingUseCase mRepeatingUseCase;
     private FakeUseCaseConfig mFakeUseCaseConfig;
-    private String mCameraId;
     private FakeLifecycleOwner mLifecycleOwner;
     private Executor mMainExecutor;
     private ContentResolver mContentResolver;
 
-    private ImageCaptureConfig createNonRotatedConfiguration()
-            throws CameraInfoUnavailableException {
+    private ImageCaptureConfig createNonRotatedConfiguration() {
         // Create a configuration with target rotation that matches the sensor rotation.
         // This assumes a back-facing camera (facing away from screen)
-        String backCameraId = CameraX.getCameraWithLensFacing(BACK_LENS_FACING);
-        int sensorRotation = CameraX.getCameraInfo(backCameraId).getSensorRotationDegrees();
-
-        int surfaceRotation = Surface.ROTATION_0;
-        switch (sensorRotation) {
-            case 0:
-                surfaceRotation = Surface.ROTATION_0;
-                break;
-            case 90:
-                surfaceRotation = Surface.ROTATION_90;
-                break;
-            case 180:
-                surfaceRotation = Surface.ROTATION_180;
-                break;
-            case 270:
-                surfaceRotation = Surface.ROTATION_270;
-                break;
-            default:
-                throw new IllegalStateException("Invalid sensor rotation: " + sensorRotation);
-        }
+        Integer sensorRotation = CameraUtil.getSensorOrientation(BACK_LENS_FACING);
+        int surfaceRotation = CameraOrientationUtil.degreesToSurfaceRotation(sensorRotation);
 
         return new ImageCapture.Builder()
                 .setTargetRotation(surfaceRotation)
@@ -184,8 +162,7 @@
 
         // Get the camera ID
         mInstrumentation.runOnMainSync(() -> {
-            Camera camera = CameraX.bindToLifecycle(mLifecycleOwner, BACK_SELECTOR);
-            mCameraId = Camera2CameraInfo.extractCameraId(camera.getCameraInfo());
+            CameraX.bindToLifecycle(mLifecycleOwner, BACK_SELECTOR);
         });
     }
 
@@ -247,9 +224,8 @@
 
             // Checks camera device sensor degrees to set correct target rotation value to make sure
             // the exactly matching result size 640x480 can be selected if the device supports it.
-            String cameraId = CameraX.getCameraFactory().cameraIdForLensFacing(lensFacing);
-            boolean isRotateNeeded = (CameraX.getCameraInfo(cameraId).getSensorRotationDegrees(
-                    Surface.ROTATION_0) % 180) != 0;
+            Integer sensorOrientation = CameraUtil.getSensorOrientation(BACK_LENS_FACING);
+            boolean isRotateNeeded = (sensorOrientation % 180) != 0;
             ImageCapture useCase = new ImageCapture.Builder().setTargetResolution(
                     GUARANTEED_RESOLUTION).setTargetRotation(
                     isRotateNeeded ? Surface.ROTATION_90 : Surface.ROTATION_0).build();
@@ -647,9 +623,9 @@
 
     @Test
     public void takePicture_withBufferFormatRaw10()
-            throws CameraAccessException, ExecutionException, InterruptedException {
+            throws ExecutionException, InterruptedException {
         CameraCharacteristics cameraCharacteristics =
-                CameraUtil.getCameraManager().getCameraCharacteristics(mCameraId);
+                CameraUtil.getCameraCharacteristics(BACK_LENS_FACING);
         StreamConfigurationMap map =
                 cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
         Size[] resolutions = map.getOutputSizes(ImageFormat.RAW10);
@@ -901,8 +877,7 @@
 
     @Test
     public void capturedImageHasCorrectCroppingSizeWithoutSettingRotation()
-            throws ExecutionException,
-            InterruptedException, CameraInfoUnavailableException {
+            throws ExecutionException, InterruptedException {
         ImageCapture useCase = new ImageCapture.Builder().setTargetResolution(
                 DEFAULT_RESOLUTION).build();
 
@@ -939,13 +914,11 @@
 
     @Test
     public void capturedImageHasCorrectCroppingSizeSetRotationBuilder() throws ExecutionException,
-            InterruptedException, CameraInfoUnavailableException {
+            InterruptedException {
         // Checks camera device sensor degrees to set correct target rotation value to make sure
         // that the initial set target cropping aspect ratio matches the sensor orientation.
-        String cameraId = CameraX.getCameraFactory().cameraIdForLensFacing(
-                CameraSelector.LENS_FACING_BACK);
-        boolean isRotateNeeded = (CameraX.getCameraInfo(cameraId).getSensorRotationDegrees(
-                Surface.ROTATION_0) % 180) != 0;
+        Integer sensorOrientation = CameraUtil.getSensorOrientation(BACK_LENS_FACING);
+        boolean isRotateNeeded = (sensorOrientation % 180) != 0;
         ImageCapture useCase = new ImageCapture.Builder().setTargetResolution(
                 DEFAULT_RESOLUTION).setTargetRotation(
                 isRotateNeeded ? Surface.ROTATION_90 : Surface.ROTATION_0).build();
@@ -984,13 +957,11 @@
     @Test
     public void capturedImageHasCorrectCroppingSize_setUseCaseRotation90FromRotationInBuilder()
             throws ExecutionException,
-            InterruptedException, CameraInfoUnavailableException {
+            InterruptedException {
         // Checks camera device sensor degrees to set correct target rotation value to make sure
         // that the initial set target cropping aspect ratio matches the sensor orientation.
-        String cameraId = CameraX.getCameraFactory().cameraIdForLensFacing(
-                CameraSelector.LENS_FACING_BACK);
-        boolean isRotateNeeded = (CameraX.getCameraInfo(cameraId).getSensorRotationDegrees(
-                Surface.ROTATION_0) % 180) != 0;
+        Integer sensorOrientation = CameraUtil.getSensorOrientation(BACK_LENS_FACING);
+        boolean isRotateNeeded = (sensorOrientation % 180) != 0;
         ImageCapture useCase = new ImageCapture.Builder().setTargetResolution(
                 DEFAULT_RESOLUTION).setTargetRotation(
                 isRotateNeeded ? Surface.ROTATION_90 : Surface.ROTATION_0).build();
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java
index 0efead8..0785dc3 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java
@@ -243,9 +243,9 @@
 
             // Checks camera device sensor degrees to set correct target rotation value to make sure
             // the exactly matching result size 640x480 can be selected if the device supports it.
-            String cameraId = CameraX.getCameraFactory().cameraIdForLensFacing(lensFacing);
-            boolean isRotateNeeded = (CameraX.getCameraInfo(cameraId).getSensorRotationDegrees(
-                    Surface.ROTATION_0) % 180) != 0;
+            Integer sensorOrientation = CameraUtil.getSensorOrientation(
+                    CameraSelector.LENS_FACING_BACK);
+            boolean isRotateNeeded = (sensorOrientation % 180) != 0;
             Preview preview = new Preview.Builder().setTargetResolution(
                     GUARANTEED_RESOLUTION).setTargetRotation(
                     isRotateNeeded ? Surface.ROTATION_90 : Surface.ROTATION_0).build();
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlTest.java
index c917bfd..1ac337b 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlTest.java
@@ -40,11 +40,8 @@
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
-import android.content.Context;
 import android.graphics.Rect;
-import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCharacteristics;
-import android.hardware.camera2.CameraManager;
 import android.hardware.camera2.CaptureRequest;
 import android.os.Build;
 import android.os.Handler;
@@ -53,7 +50,6 @@
 import androidx.annotation.NonNull;
 import androidx.camera.camera2.impl.Camera2ImplConfig;
 import androidx.camera.core.CameraControl;
-import androidx.camera.core.CameraInfoUnavailableException;
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.FocusMeteringAction;
 import androidx.camera.core.ImageCapture;
@@ -65,7 +61,6 @@
 import androidx.camera.testing.CameraUtil;
 import androidx.camera.testing.HandlerUtil;
 import androidx.core.os.HandlerCompat;
-import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
@@ -100,13 +95,9 @@
     private boolean mHasFlashUnit;
 
     @Before
-    public void setUp() throws InterruptedException, CameraAccessException,
-            CameraInfoUnavailableException {
+    public void setUp() throws InterruptedException {
         assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK));
 
-        Context context = ApplicationProvider.getApplicationContext();
-        CameraManager cameraManager = (CameraManager) context.getSystemService(
-                Context.CAMERA_SERVICE);
         mCameraCharacteristics = CameraUtil.getCameraCharacteristics(
                 CameraSelector.LENS_FACING_BACK);
         Boolean hasFlashUnit =
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java
index f58c8b1..c5bec6d 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java
@@ -132,16 +132,6 @@
     String mCameraId;
     SemaphoreReleasingCamera2Callbacks.SessionStateCallback mSessionStateCallback;
 
-    private static String getCameraIdForLensFacingUnchecked(
-            @CameraSelector.LensFacing int lensFacing) {
-        try {
-            return sCameraFactory.cameraIdForLensFacing(lensFacing);
-        } catch (Exception e) {
-            throw new IllegalArgumentException(
-                    "Unable to attach to camera with LensFacing " + lensFacing, e);
-        }
-    }
-
     @BeforeClass
     public static void classSetup() {
         sCameraHandlerThread = new HandlerThread("cameraThread");
@@ -162,8 +152,7 @@
         assumeTrue(CameraUtil.deviceHasCamera());
         mMockOnImageAvailableListener = Mockito.mock(ImageReader.OnImageAvailableListener.class);
         mSessionStateCallback = new SemaphoreReleasingCamera2Callbacks.SessionStateCallback();
-
-        mCameraId = getCameraIdForLensFacingUnchecked(DEFAULT_LENS_FACING);
+        mCameraId = CameraUtil.getCameraIdWithLensFacing(DEFAULT_LENS_FACING);
         mSemaphore = new Semaphore(0);
         mCameraStateRegistry = new CameraStateRegistry(DEFAULT_AVAILABLE_CAMERA_COUNT);
         mCamera2CameraImpl = new Camera2CameraImpl(
@@ -788,7 +777,7 @@
             Integer lensFacing =
                     cameraSelector.getLensFacing() == null ? CameraSelector.LENS_FACING_BACK :
                             cameraSelector.getLensFacing();
-            mCameraId = getCameraIdForLensFacingUnchecked(lensFacing);
+            mCameraId = CameraUtil.getCameraIdWithLensFacing(lensFacing);
             onAttach(new FakeCamera(mCameraId, null,
                     new FakeCameraInfoInternal(mCameraId, 0, lensFacing)));
             updateSuggestedResolution(new Size(640, 480));
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2ImplCameraXTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2ImplCameraXTest.java
index d3b9939..eec7f6f 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2ImplCameraXTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2ImplCameraXTest.java
@@ -164,8 +164,7 @@
         // Legacy device would not support two ImageAnalysis use cases combination.
         int hardwareLevelValue;
         CameraCharacteristics cameraCharacteristics =
-                CameraUtil.getCameraManager().getCameraCharacteristics(
-                        CameraX.getCameraWithLensFacing(DEFAULT_LENS_FACING));
+                CameraUtil.getCameraCharacteristics(DEFAULT_LENS_FACING);
         hardwareLevelValue = cameraCharacteristics.get(
                 CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
         assumeTrue(
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java
index 4b117f1..b73d763 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java
@@ -30,7 +30,6 @@
 import android.graphics.Rect;
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCharacteristics;
-import android.hardware.camera2.CameraManager;
 import android.hardware.camera2.CaptureRequest;
 import android.os.Handler;
 import android.os.HandlerThread;
@@ -91,10 +90,8 @@
         CameraXConfig config = Camera2Config.defaultConfig();
         CameraX.initialize(context, config);
 
-        String cameraId = CameraX.getCameraWithLensFacing(CameraSelector.LENS_FACING_BACK);
-        CameraManager cameraManager = (CameraManager) context.getSystemService(
-                Context.CAMERA_SERVICE);
-        mCameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
+        mCameraCharacteristics =
+                CameraUtil.getCameraCharacteristics(CameraSelector.LENS_FACING_BACK);
 
         assumeTrue(getMaxDigitalZoom() >= 2.0);
 
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraFactory.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraFactory.java
index 9ecbb96..7583185 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraFactory.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraFactory.java
@@ -18,14 +18,10 @@
 
 import android.content.Context;
 import android.hardware.camera2.CameraAccessException;
-import android.hardware.camera2.CameraCharacteristics;
-import android.hardware.camera2.CameraMetadata;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.camera.camera2.internal.compat.CameraManagerCompat;
 import androidx.camera.core.CameraInfoUnavailableException;
-import androidx.camera.core.CameraSelector;
 import androidx.camera.core.impl.CameraFactory;
 import androidx.camera.core.impl.CameraInternal;
 import androidx.camera.core.impl.CameraStateRegistry;
@@ -79,40 +75,4 @@
         // Use a LinkedHashSet to preserve order
         return new LinkedHashSet<>(camerasList);
     }
-
-    @Override
-    @Nullable
-    public String cameraIdForLensFacing(@CameraSelector.LensFacing int lensFacing)
-            throws CameraInfoUnavailableException {
-        Set<String> cameraIds = getAvailableCameraIds();
-
-        Integer lensFacingInteger = -1;
-        switch (lensFacing) {
-            case CameraSelector.LENS_FACING_BACK:
-                lensFacingInteger = CameraMetadata.LENS_FACING_BACK;
-                break;
-            case CameraSelector.LENS_FACING_FRONT:
-                lensFacingInteger = CameraMetadata.LENS_FACING_FRONT;
-                break;
-        }
-
-        for (String cameraId : cameraIds) {
-            CameraCharacteristics characteristics = null;
-            try {
-                characteristics = mCameraManager.unwrap().getCameraCharacteristics(cameraId);
-            } catch (CameraAccessException e) {
-                throw new CameraInfoUnavailableException(
-                        "Unable to retrieve info for camera with id " + cameraId + ".", e);
-            }
-            Integer cameraLensFacing = characteristics.get(CameraCharacteristics.LENS_FACING);
-            if (cameraLensFacing == null) {
-                continue;
-            }
-            if (cameraLensFacing.equals(lensFacingInteger)) {
-                return cameraId;
-            }
-        }
-
-        return null;
-    }
 }
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManagerTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManagerTest.java
index e6ebccd..234bcfb 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManagerTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManagerTest.java
@@ -522,15 +522,11 @@
         addCamera(
                 LEGACY_CAMERA_ID, CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY, null,
                 CameraCharacteristics.LENS_FACING_FRONT);
-        mCameraFactory.setDefaultCameraIdForLensFacing(CameraSelector.LENS_FACING_FRONT,
-                LEGACY_CAMERA_ID);
 
         addCamera(
                 LIMITED_CAMERA_ID, CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED,
                 null,
                 CameraCharacteristics.LENS_FACING_BACK);
-        mCameraFactory.setDefaultCameraIdForLensFacing(CameraSelector.LENS_FACING_BACK,
-                LIMITED_CAMERA_ID);
 
         addCamera(
                 FULL_CAMERA_ID, CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_FULL, null,
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java
index b1bc254..4eaa705 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java
@@ -76,7 +76,6 @@
 
     private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
     private Context mContext;
-    private String mCameraId;
     private CameraInternal mCameraInternal;
     private FakeLifecycleOwner mLifecycle;
     private CameraXConfig.Builder mConfigBuilder;
@@ -95,7 +94,6 @@
         mCameraInternal = new FakeCamera(mock(CameraControlInternal.class),
                 new FakeCameraInfoInternal(0, CAMERA_LENS_FACING));
         mFakeCameraFactory.insertCamera(CAMERA_LENS_FACING, CAMERA_ID, () -> mCameraInternal);
-        mFakeCameraFactory.setDefaultCameraIdForLensFacing(CAMERA_LENS_FACING, CAMERA_ID);
         mConfigBuilder =
                 new CameraXConfig.Builder()
                         .setCameraFactoryProvider((ignored0, ignored1) -> mFakeCameraFactory)
@@ -104,8 +102,6 @@
                         .setUseCaseConfigFactoryProvider(ignored -> mUseCaseConfigFactory);
 
         mLifecycle = new FakeLifecycleOwner();
-
-        mCameraId = mFakeCameraFactory.cameraIdForLensFacing(CAMERA_LENS_FACING);
     }
 
     @After
@@ -429,17 +425,16 @@
                 fakeConfigBuilder.getUseCaseConfig());
 
         CameraX.bindToLifecycle(mLifecycle, CAMERA_SELECTOR, fakeUseCase);
-        Mockito.verify(eventCallback).onBind(mCameraId);
+        Mockito.verify(eventCallback).onBind(CAMERA_ID);
 
         CameraX.unbind(fakeUseCase);
         Mockito.verify(eventCallback).onUnbind();
     }
 
     @Test
-    public void canRetrieveCameraInfo() throws CameraInfoUnavailableException {
+    public void canRetrieveCameraInfo() {
         initCameraX();
-        String cameraId = CameraX.getCameraWithLensFacing(CAMERA_LENS_FACING);
-        CameraInfoInternal cameraInfoInternal = CameraX.getCameraInfo(cameraId);
+        CameraInfoInternal cameraInfoInternal = CameraX.getCameraInfo(CAMERA_ID);
         assertThat(cameraInfoInternal).isNotNull();
         assertThat(cameraInfoInternal.getLensFacing()).isEqualTo(CAMERA_LENS_FACING);
     }
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java
index 77140ee..e0ca41e 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java
@@ -33,11 +33,11 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.CameraX;
 import androidx.camera.core.CameraXConfig;
+import androidx.camera.testing.CameraUtil;
 import androidx.camera.testing.DeferrableSurfacesUtil;
 import androidx.camera.testing.fakes.FakeAppConfig;
 import androidx.camera.testing.fakes.FakeUseCase;
 import androidx.camera.testing.fakes.FakeUseCaseConfig;
-import androidx.core.util.Preconditions;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
@@ -66,16 +66,11 @@
         CameraXConfig cameraXConfig = FakeAppConfig.create();
         Context context = ApplicationProvider.getApplicationContext();
         CameraThreadConfig mockThreadConfig = mock(CameraThreadConfig.class);
-        CameraFactory cameraFactory = Preconditions.checkNotNull(
-                cameraXConfig.getCameraFactoryProvider(/*valueIfMissing=*/ null))
-                .newInstance(context, mockThreadConfig);
         CameraX.initialize(context, cameraXConfig).get();
-        try {
-            mCameraId = cameraFactory.cameraIdForLensFacing(CameraSelector.LENS_FACING_BACK);
-        } catch (Exception e) {
-            throw new IllegalArgumentException(
-                    "Unable to attach to camera with LensFacing " + CameraSelector.LENS_FACING_BACK,
-                    e);
+        mCameraId = CameraUtil.getCameraIdWithLensFacing(CameraSelector.LENS_FACING_BACK);
+        if (mCameraId == null) {
+            throw new IllegalArgumentException("Unable to attach to camera with LensFacing "
+                            + CameraSelector.LENS_FACING_BACK);
         }
     }
 
@@ -95,8 +90,7 @@
                 new FakeUseCaseConfig.Builder()
                         .setTargetName("UseCase")
                         .getUseCaseConfig();
-        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_BACK_CAMERA,
-                mCameraId);
+        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_BACK_CAMERA);
 
         useCaseAttachState.setUseCaseOnline(fakeUseCase);
 
@@ -127,12 +121,10 @@
         UseCaseAttachState useCaseAttachState = new UseCaseAttachState(mCameraId);
         FakeUseCaseConfig config0 = new FakeUseCaseConfig.Builder().setTargetName(
                 "UseCase").getUseCaseConfig();
-        TestUseCase fakeUseCase0 = createTestUseCase(config0, CameraSelector.DEFAULT_BACK_CAMERA,
-                mCameraId);
+        TestUseCase fakeUseCase0 = createTestUseCase(config0, CameraSelector.DEFAULT_BACK_CAMERA);
         FakeUseCaseConfig config1 = new FakeUseCaseConfig.Builder().setTargetName(
                 "UseCase").getUseCaseConfig();
-        TestUseCase fakeUseCase1 = createTestUseCase(config1, CameraSelector.DEFAULT_BACK_CAMERA,
-                mCameraId);
+        TestUseCase fakeUseCase1 = createTestUseCase(config1, CameraSelector.DEFAULT_BACK_CAMERA);
 
         useCaseAttachState.setUseCaseOnline(fakeUseCase0);
         useCaseAttachState.setUseCaseOnline(fakeUseCase1);
@@ -169,8 +161,7 @@
         UseCaseAttachState useCaseAttachState = new UseCaseAttachState(mCameraId);
         FakeUseCaseConfig config = new FakeUseCaseConfig.Builder().setTargetName(
                 "UseCase").getUseCaseConfig();
-        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_BACK_CAMERA,
-                mCameraId);
+        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_BACK_CAMERA);
 
         useCaseAttachState.setUseCaseActive(fakeUseCase);
 
@@ -200,8 +191,7 @@
         UseCaseAttachState useCaseAttachState = new UseCaseAttachState(mCameraId);
         FakeUseCaseConfig config = new FakeUseCaseConfig.Builder().setTargetName(
                 "UseCase").getUseCaseConfig();
-        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_BACK_CAMERA,
-                mCameraId);
+        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_BACK_CAMERA);
 
         useCaseAttachState.setUseCaseOnline(fakeUseCase);
         useCaseAttachState.setUseCaseActive(fakeUseCase);
@@ -233,8 +223,7 @@
         UseCaseAttachState useCaseAttachState = new UseCaseAttachState(mCameraId);
         FakeUseCaseConfig config = new FakeUseCaseConfig.Builder().setTargetName(
                 "UseCase").getUseCaseConfig();
-        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_BACK_CAMERA,
-                mCameraId);
+        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_BACK_CAMERA);
 
         useCaseAttachState.setUseCaseOnline(fakeUseCase);
         useCaseAttachState.setUseCaseOffline(fakeUseCase);
@@ -265,8 +254,7 @@
         UseCaseAttachState useCaseAttachState = new UseCaseAttachState(mCameraId);
         FakeUseCaseConfig config = new FakeUseCaseConfig.Builder().setTargetName(
                 "UseCase").getUseCaseConfig();
-        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_BACK_CAMERA,
-                mCameraId);
+        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_BACK_CAMERA);
 
         useCaseAttachState.setUseCaseOnline(fakeUseCase);
         useCaseAttachState.setUseCaseActive(fakeUseCase);
@@ -298,8 +286,7 @@
         UseCaseAttachState useCaseAttachState = new UseCaseAttachState(mCameraId);
         FakeUseCaseConfig config = new FakeUseCaseConfig.Builder().setTargetName(
                 "UseCase").getUseCaseConfig();
-        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_BACK_CAMERA,
-                mCameraId);
+        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_BACK_CAMERA);
 
         useCaseAttachState.setUseCaseOnline(fakeUseCase);
         useCaseAttachState.setUseCaseActive(fakeUseCase);
@@ -326,8 +313,7 @@
         UseCaseAttachState useCaseAttachState = new UseCaseAttachState(mCameraId);
         FakeUseCaseConfig config = new FakeUseCaseConfig.Builder().setTargetName(
                 "UseCase").getUseCaseConfig();
-        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_FRONT_CAMERA,
-                mCameraId);
+        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_FRONT_CAMERA);
 
         // Should throw IllegalArgumentException
         useCaseAttachState.setUseCaseOnline(fakeUseCase);
@@ -338,16 +324,14 @@
         UseCaseAttachState useCaseAttachState = new UseCaseAttachState(mCameraId);
         FakeUseCaseConfig config = new FakeUseCaseConfig.Builder().setTargetName(
                 "UseCase").getUseCaseConfig();
-        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_FRONT_CAMERA,
-                mCameraId);
+        TestUseCase fakeUseCase = createTestUseCase(config, CameraSelector.DEFAULT_FRONT_CAMERA);
 
         // Should throw IllegalArgumentException
         useCaseAttachState.setUseCaseActive(fakeUseCase);
     }
 
-    private TestUseCase createTestUseCase(FakeUseCaseConfig config, CameraSelector selector,
-            String cameraId) {
-        TestUseCase testUseCase = new TestUseCase(config, selector, cameraId);
+    private TestUseCase createTestUseCase(FakeUseCaseConfig config, CameraSelector selector) {
+        TestUseCase testUseCase = new TestUseCase(config, selector);
         mTestUseCases.add(testUseCase);
         return testUseCase;
     }
@@ -362,7 +346,7 @@
                 mock(CameraCaptureCallback.class);
         private DeferrableSurface mDeferrableSurface;
 
-        TestUseCase(FakeUseCaseConfig config, CameraSelector selector, String cameraId) {
+        TestUseCase(FakeUseCaseConfig config, CameraSelector selector) {
             super(config);
             onAttach(CameraX.getCameraWithCameraSelector(selector));
             updateSuggestedResolution(new Size(640, 480));
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java
index d435334..5699def 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java
@@ -456,31 +456,11 @@
     }
 
     /**
-     * Returns the camera id for a camera with the specified lens facing.
-     *
-     * <p>This only gives the first (primary) camera found with the specified facing.
-     *
-     * @param lensFacing the lens facing of the camera
-     * @return the camera id if camera exists or {@code null} if no camera with specified facing
-     * exists
-     * @throws CameraInfoUnavailableException if unable to access cameras, perhaps due to
-     *                                        insufficient permissions.
-     * @hide
-     */
-    @RestrictTo(Scope.LIBRARY_GROUP)
-    @Nullable
-    public static String getCameraWithLensFacing(@CameraSelector.LensFacing int lensFacing)
-            throws CameraInfoUnavailableException {
-        checkInitialized();
-        return getCameraFactory().cameraIdForLensFacing(lensFacing);
-    }
-
-    /**
      * Returns the camera id for a camera defined by the given {@link CameraSelector}.
      *
      * @param cameraSelector the camera selector
      * @return the camera id if camera exists or {@code null} if no camera can be resolved with
-     * the camera selector
+     * the camera selector.
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
@@ -497,21 +477,19 @@
      * available camera.
      *
      * @return The default lens facing.
-     * @throws CameraInfoUnavailableException if unable to access cameras, perhaps due to
-     *                                        insufficient permissions.
+     * @throws IllegalStateException if unable to find a camera with available lens facing.
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
     @CameraSelector.LensFacing
-    public static int getDefaultLensFacing() throws CameraInfoUnavailableException {
+    public static int getDefaultLensFacing() {
         checkInitialized();
 
         Integer lensFacingCandidate = null;
         List<Integer> lensFacingList = Arrays.asList(CameraSelector.LENS_FACING_BACK,
                 CameraSelector.LENS_FACING_FRONT);
         for (Integer lensFacing : lensFacingList) {
-            String cameraId = getCameraFactory().cameraIdForLensFacing(lensFacing);
-            if (cameraId != null) {
+            if (hasCamera(new CameraSelector.Builder().requireLensFacing(lensFacing).build())) {
                 lensFacingCandidate = lensFacing;
                 break;
             }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java
index 30a3db5..c1ce609 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java
@@ -19,9 +19,7 @@
 import android.content.Context;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.camera.core.CameraInfoUnavailableException;
-import androidx.camera.core.CameraSelector;
 
 import java.util.Set;
 
@@ -61,17 +59,4 @@
      */
     @NonNull
     Set<String> getAvailableCameraIds() throws CameraInfoUnavailableException;
-
-    /**
-     * Gets the first id of the camera with the given lens facing. Returns null if there's no
-     * camera with given lens facing.
-     *
-     * @param lensFacing the lens facing to query camera id with
-     * @return the first id of the camera with the given lens facing
-     * @throws CameraInfoUnavailableException if unable to access cameras, perhaps due
-     *                                        to insufficient permissions.
-     */
-    @Nullable
-    String cameraIdForLensFacing(@CameraSelector.LensFacing int lensFacing)
-            throws CameraInfoUnavailableException;
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CameraOrientationUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CameraOrientationUtil.java
index f626f51..096fa2c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CameraOrientationUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CameraOrientationUtil.java
@@ -97,4 +97,38 @@
 
         return rotationDegrees;
     }
+
+    /**
+     * Converts rotation degrees to their equivalent in values enumerated in {@link Surface}.
+     *
+     * <p>Valid values for the relative rotation are {@link Surface#ROTATION_0}, {@link
+     * Surface#ROTATION_90}, {@link Surface#ROTATION_180}, {@link Surface#ROTATION_270}.
+     *
+     * @param degrees The rotation value in degrees.
+     * @return One of the enumerated rotation values from {@link Surface}.
+     * @throws IllegalArgumentException If the provided rotation degrees doesn't fall into any
+     *                                  one of those defined in {@link Surface}.
+     */
+    @RotationValue
+    public static int degreesToSurfaceRotation(int degrees) {
+        int surfaceRotation = Surface.ROTATION_0;
+        switch (degrees) {
+            case 0:
+                surfaceRotation = Surface.ROTATION_0;
+                break;
+            case 90:
+                surfaceRotation = Surface.ROTATION_90;
+                break;
+            case 180:
+                surfaceRotation = Surface.ROTATION_180;
+                break;
+            case 270:
+                surfaceRotation = Surface.ROTATION_270;
+                break;
+            default:
+                throw new IllegalStateException("Invalid sensor rotation: " + degrees);
+        }
+
+        return surfaceRotation;
+    }
 }
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.java b/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.java
index 5771a77..f1606fe 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.java
+++ b/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.java
@@ -79,13 +79,11 @@
                         CameraSelector.LENS_FACING_BACK));
         cameraFactory.insertCamera(CameraSelector.LENS_FACING_BACK, REAR_ID, () -> mRearCamera);
         mCameras.add(mRearCamera);
-        cameraFactory.setDefaultCameraIdForLensFacing(CameraSelector.LENS_FACING_BACK, REAR_ID);
         mFrontCamera = new FakeCamera(mock(CameraControlInternal.class),
                 new FakeCameraInfoInternal(FRONT_ROTATION_DEGREE,
                         CameraSelector.LENS_FACING_FRONT));
         cameraFactory.insertCamera(CameraSelector.LENS_FACING_FRONT, FRONT_ID, () -> mFrontCamera);
         mCameras.add(mFrontCamera);
-        cameraFactory.setDefaultCameraIdForLensFacing(CameraSelector.LENS_FACING_FRONT, FRONT_ID);
         CameraXConfig.Builder appConfigBuilder =
                 new CameraXConfig.Builder()
                         .setCameraFactoryProvider((ignored1, ignored2) -> cameraFactory)
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java
index d47926f..3ddf985 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionTest.java
@@ -34,9 +34,7 @@
 import android.app.Instrumentation;
 import android.content.Context;
 import android.graphics.SurfaceTexture;
-import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCharacteristics;
-import android.hardware.camera2.CameraManager;
 import android.os.Build;
 import android.util.Size;
 
@@ -114,8 +112,7 @@
         assumeTrue(CameraUtil.hasCameraWithLensFacing(mLensFacing));
         assumeTrue(ExtensionsTestUtil.initExtensions());
         assumeTrue(ExtensionsManager.isExtensionAvailable(mEffectMode, mLensFacing));
-        assumeTrue(isTargetDeviceAvailableForExtensions(context,
-                CameraX.getCameraWithLensFacing(mLensFacing)));
+        assumeTrue(isTargetDeviceAvailableForExtensions(mLensFacing));
 
         mLifecycleOwner = new FakeLifecycleOwner();
         mLifecycleOwner.startAndResume();
@@ -210,22 +207,15 @@
      * target devices need to be LIMITED hardware level at least to support two YUV_420_888
      * streams at the same time.
      *
-     * @param context  The context to obtain CameraCharacteristics.
-     * @param cameraId The id of the testing target camera device.
      * @return true if the testing target camera device is LIMITED hardware level at least.
+     * @throws IllegalArgumentException if unable to retrieve {@link CameraCharacteristics} for
+     *                                  given lens facing.
      */
-    private boolean isTargetDeviceAvailableForExtensions(@NonNull Context context,
-            @NonNull String cameraId) {
+    private boolean isTargetDeviceAvailableForExtensions(
+            @CameraSelector.LensFacing int lensFacing) {
         boolean isAvailable = false;
-        CameraManager cameraManager = (CameraManager) context.getSystemService(
-                Context.CAMERA_SERVICE);
-        CameraCharacteristics cameraCharacteristics = null;
-        try {
-            cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
-        } catch (CameraAccessException e) {
-            throw new IllegalArgumentException(
-                    "Unable to retrieve info for camera with id " + cameraId + ".", e);
-        }
+        CameraCharacteristics cameraCharacteristics = CameraUtil.getCameraCharacteristics(
+                lensFacing);
 
         if (cameraCharacteristics != null) {
             Integer keyValue = cameraCharacteristics.get(
@@ -235,6 +225,9 @@
                 isAvailable =
                         keyValue != CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY;
             }
+        } else {
+            throw new IllegalArgumentException(
+                    "Unable to retrieve info for " + lensFacing + " camera.");
         }
 
         return isAvailable;
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
index f0a9de3..2d2c954 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
@@ -278,7 +278,29 @@
     }
 
     /**
-     * Check if the device has a flash unit with the specified lensFacing.
+     * Gets the camera id of the first camera with the given lensFacing.
+     *
+     * @param lensFacing The desired camera lensFacing.
+     * @return Camera id of the first camera with the given lensFacing, null if there's no camera
+     * has the lensFacing.
+     * @throws IllegalStateException if the CAMERA permission is not currently granted.
+     */
+    @Nullable
+    public static String getCameraIdWithLensFacing(@CameraSelector.LensFacing int lensFacing) {
+        @SupportedLensFacingInt
+        int lensFacingInteger = getLensFacingIntFromEnum(lensFacing);
+        for (String cameraId : getCameraIdListOrThrow()) {
+            CameraCharacteristics characteristics = getCameraCharacteristicsOrThrow(cameraId);
+            Integer cameraLensFacing = characteristics.get(CameraCharacteristics.LENS_FACING);
+            if (cameraLensFacing != null && cameraLensFacing.intValue() == lensFacingInteger) {
+                return cameraId;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Checks if the device has a flash unit with the specified lensFacing.
      *
      * @param lensFacing The desired camera lensFacing.
      * @return True if the device has flash unit with the specified LensFacing.
@@ -353,6 +375,28 @@
     }
 
     /**
+     * Gets if the sensor orientation of the given lens facing.
+     *
+     * @param lensFacing The desired camera lensFacing.
+     * @return The sensor orientation degrees, or null if it's undefined.
+     * @throws IllegalStateException if the CAMERA permission is not currently granted.
+     */
+    @Nullable
+    public static Integer getSensorOrientation(@CameraSelector.LensFacing int lensFacing) {
+        @SupportedLensFacingInt
+        int lensFacingInteger = getLensFacingIntFromEnum(lensFacing);
+        for (String cameraId : getCameraIdListOrThrow()) {
+            CameraCharacteristics characteristics = getCameraCharacteristicsOrThrow(cameraId);
+            Integer cameraLensFacing = characteristics.get(CameraCharacteristics.LENS_FACING);
+            if (cameraLensFacing == null || cameraLensFacing.intValue() != lensFacingInteger) {
+                continue;
+            }
+            return characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
+        }
+        return null;
+    }
+
+    /**
      * Converts a lens facing direction from a lensFacing to a {@link CameraMetadata} integer.
      *
      * @param lensFacing The lens facing enum, as defined in {@link CameraSelector}.
@@ -391,7 +435,8 @@
      * @return the camera id list
      * @throws IllegalStateException if the CAMERA permission is not currently granted.
      */
-    private static CameraCharacteristics getCameraCharacteristicsOrThrow(String cameraId) {
+    @NonNull
+    private static CameraCharacteristics getCameraCharacteristicsOrThrow(@NonNull String cameraId) {
         try {
             return getCameraManager().getCameraCharacteristics(cameraId);
         } catch (CameraAccessException e) {
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java
index da023da..5376a71 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java
@@ -30,7 +30,6 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.AppCompatActivity;
-import androidx.camera.core.CameraInfoUnavailableException;
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.CameraX;
 import androidx.camera.core.Preview;
@@ -81,7 +80,7 @@
         if (!CameraUtil.hasCameraWithLensFacing(mLensFacing)) {
             try {
                 mLensFacing = CameraX.getDefaultLensFacing();
-            } catch (CameraInfoUnavailableException e) {
+            } catch (IllegalStateException e) {
                 throw new IllegalArgumentException("Cannot find camera to use", e);
             }
         }
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java
index afb7ce0..0352513 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java
@@ -40,14 +40,8 @@
  */
 @RestrictTo(Scope.LIBRARY_GROUP)
 public final class FakeCameraFactory implements CameraFactory {
-
-    private static final String DEFAULT_BACK_ID = "0";
-    private static final String DEFAULT_FRONT_ID = "1";
-
     @Nullable
     private Set<String> mCachedCameraIds;
-    private String mFrontCameraId = DEFAULT_FRONT_ID;
-    private String mBackCameraId = DEFAULT_BACK_ID;
 
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     final Map<String, Pair<Integer, Callable<CameraInternal>>> mCameraMap = new HashMap<>();
@@ -86,8 +80,7 @@
      * Inserts a camera and sets it as the default front camera.
      *
      * <p>This is a convenience method for calling
-     * {@link #insertCamera(int, String, Callable)}
-     * followed by {@link #setDefaultCameraIdForLensFacing(int, String)} with
+     * {@link #insertCamera(int, String, Callable)} with
      * {@link CameraSelector#LENS_FACING_FRONT} for all lens facing arguments.
      *
      * @param cameraId       Identifier to use for the front camera.
@@ -96,15 +89,13 @@
     public void insertDefaultFrontCamera(@NonNull String cameraId,
             @NonNull Callable<CameraInternal> cameraInternal) {
         insertCamera(CameraSelector.LENS_FACING_FRONT, cameraId, cameraInternal);
-        setDefaultCameraIdForLensFacing(CameraSelector.LENS_FACING_FRONT, cameraId);
     }
 
     /**
      * Inserts a camera and sets it as the default back camera.
      *
      * <p>This is a convenience method for calling
-     * {@link #insertCamera(int, String, Callable)}
-     * followed by {@link #setDefaultCameraIdForLensFacing(int, String)} with
+     * {@link #insertCamera(int, String, Callable)} with
      * {@link CameraSelector#LENS_FACING_BACK} for all lens facing arguments.
      *
      * @param cameraId       Identifier to use for the back camera.
@@ -113,27 +104,6 @@
     public void insertDefaultBackCamera(@NonNull String cameraId,
             @NonNull Callable<CameraInternal> cameraInternal) {
         insertCamera(CameraSelector.LENS_FACING_BACK, cameraId, cameraInternal);
-        setDefaultCameraIdForLensFacing(CameraSelector.LENS_FACING_BACK, cameraId);
-    }
-
-    /**
-     * Sets the camera ID which will be returned by {@link #cameraIdForLensFacing(int)}.
-     *
-     * @param lensFacing The {@link CameraSelector.LensFacing} to set.
-     * @param cameraId   The camera ID which will be returned.
-     */
-    public void setDefaultCameraIdForLensFacing(@CameraSelector.LensFacing int lensFacing,
-            @NonNull String cameraId) {
-        switch (lensFacing) {
-            case CameraSelector.LENS_FACING_FRONT:
-                mFrontCameraId = cameraId;
-                break;
-            case CameraSelector.LENS_FACING_BACK:
-                mBackCameraId = cameraId;
-                break;
-            default:
-                throw new IllegalArgumentException("Invalid lens facing: " + lensFacing);
-        }
     }
 
     @Override
@@ -147,17 +117,4 @@
 
         return mCachedCameraIds;
     }
-
-    @Override
-    @Nullable
-    public String cameraIdForLensFacing(@CameraSelector.LensFacing int lensFacing) {
-        switch (lensFacing) {
-            case CameraSelector.LENS_FACING_FRONT:
-                return mFrontCameraId;
-            case CameraSelector.LENS_FACING_BACK:
-                return mBackCameraId;
-            default:
-                return null;
-        }
-    }
 }
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/CameraXModule.java b/camera/camera-view/src/main/java/androidx/camera/view/CameraXModule.java
index 97d7c32..081d790 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/CameraXModule.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/CameraXModule.java
@@ -366,14 +366,8 @@
 
     @RequiresPermission(permission.CAMERA)
     public boolean hasCameraWithLensFacing(@CameraSelector.LensFacing int lensFacing) {
-        String cameraId;
-        try {
-            cameraId = CameraX.getCameraWithLensFacing(lensFacing);
-        } catch (Exception e) {
-            throw new IllegalStateException("Unable to query lens facing.", e);
-        }
-
-        return cameraId != null;
+        return CameraX.hasCamera(
+                new CameraSelector.Builder().requireLensFacing(lensFacing).build());
     }
 
     @Nullable
diff --git a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
index 63f6674..32bef9e 100644
--- a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
+++ b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
@@ -33,7 +33,6 @@
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.camera.core.CameraSelector;
-import androidx.camera.core.CameraX;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.ImageCaptureException;
 import androidx.camera.core.Preview;
@@ -81,11 +80,6 @@
     boolean mPermissionsGranted = false;
     private CallbackToFutureAdapter.Completer<Boolean> mPermissionCompleter;
 
-    /** The cameraId to use. Assume that 0 is the typical back facing camera. */
-    private String mCurrentCameraId = "0";
-
-    private String mCurrentCameraFacing = "BACK";
-
     @Nullable
     private Preview mPreview;
 
@@ -371,15 +365,6 @@
         StrictMode.setVmPolicy(policy);
         mPreviewView = findViewById(R.id.previewView);
 
-        // Get params from adb extra string
-        Bundle bundle = getIntent().getExtras();
-        if (bundle != null) {
-            String newCameraFacing = bundle.getString("cameraFacing");
-            if (newCameraFacing != null) {
-                mCurrentCameraFacing = newCameraFacing;
-            }
-        }
-
         ListenableFuture<ProcessCameraProvider> cameraProviderFuture =
                 ProcessCameraProvider.getInstance(this);
         Futures.addCallback(setupPermissions(), new FutureCallback<Boolean>() {
@@ -414,23 +399,6 @@
             return;
         }
 
-        try {
-            Log.d(TAG, "Camera Facing: " + mCurrentCameraFacing);
-            @CameraSelector.LensFacing int facing;
-            if (mCurrentCameraFacing.equalsIgnoreCase("BACK")) {
-                facing = CameraSelector.LENS_FACING_BACK;
-            } else if (mCurrentCameraFacing.equalsIgnoreCase("FRONT")) {
-                facing = CameraSelector.LENS_FACING_FRONT;
-            } else {
-                throw new RuntimeException("Invalid lens facing: " + mCurrentCameraFacing);
-            }
-            mCurrentCameraId = CameraX.getCameraWithLensFacing(facing);
-        } catch (Exception e) {
-            Log.e(TAG, "Unable to obtain camera with specified facing. " + e.getMessage());
-        }
-
-        Log.d(TAG, "Using cameraId: " + mCurrentCameraId);
-
         ListenableFuture<ExtensionsManager.ExtensionsAvailability> availability =
                 ExtensionsManager.init();