Merge "Refactor/Clean up/Fix lint errors and warnings in view artifact" into androidx-master-dev
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewTransformationDeviceTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewTransformationDeviceTest.kt
index cf225ff..1af8754 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewTransformationDeviceTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewTransformationDeviceTest.kt
@@ -36,9 +36,9 @@
  */
 @SmallTest
 @RunWith(AndroidJUnit4::class)
-class PreviewTransformationDeviceTest {
+public class PreviewTransformationDeviceTest {
 
-    companion object {
+    public companion object {
         // Size of the PreviewView. Aspect ratio 2:1.
         private val PREVIEW_VIEW_SIZE = Size(400, 200)
         private val PIVOTED_PREVIEW_VIEW_SIZE =
@@ -71,13 +71,13 @@
     private lateinit var mView: View
 
     @Before
-    fun setUp() {
+    public fun setUp() {
         mPreviewTransform = PreviewTransformation()
         mView = View(ApplicationProvider.getApplicationContext())
     }
 
     @Test
-    fun cropRectWidthOffByOnePixel_match() {
+    public fun cropRectWidthOffByOnePixel_match() {
         assertThat(
             isCropRectAspectRatioMatchPreviewView(
                 Rect(
@@ -91,7 +91,7 @@
     }
 
     @Test
-    fun cropRectWidthOffByTwoPixels_mismatch() {
+    public fun cropRectWidthOffByTwoPixels_mismatch() {
         assertThat(
             isCropRectAspectRatioMatchPreviewView(
                 Rect(
@@ -115,7 +115,7 @@
     }
 
     @Test
-    fun correctTextureViewWith0Rotation() {
+    public fun correctTextureViewWith0Rotation() {
         assertThat(getTextureViewCorrection(Surface.ROTATION_0)).isEqualTo(
             floatArrayOf(
                 0f,
@@ -131,7 +131,7 @@
     }
 
     @Test
-    fun correctTextureViewWith90Rotation() {
+    public fun correctTextureViewWith90Rotation() {
         assertThat(getTextureViewCorrection(Surface.ROTATION_90)).isEqualTo(
             floatArrayOf(
                 0f,
@@ -147,7 +147,7 @@
     }
 
     @Test
-    fun correctTextureViewWith180Rotation() {
+    public fun correctTextureViewWith180Rotation() {
         assertThat(getTextureViewCorrection(Surface.ROTATION_180)).isEqualTo(
             floatArrayOf(
                 SURFACE_SIZE.width.toFloat(),
@@ -163,7 +163,7 @@
     }
 
     @Test
-    fun correctTextureViewWith270Rotation() {
+    public fun correctTextureViewWith270Rotation() {
         assertThat(getTextureViewCorrection(Surface.ROTATION_270)).isEqualTo(
             floatArrayOf(
                 SURFACE_SIZE.width.toFloat(),
@@ -196,7 +196,7 @@
     }
 
     @Test
-    fun ratioMatch_surfaceIsScaledToFillPreviewView() {
+    public fun ratioMatch_surfaceIsScaledToFillPreviewView() {
         // Arrange.
         mPreviewTransform.setTransformationInfo(
             SurfaceRequest.TransformationInfo.of(
@@ -225,7 +225,7 @@
     }
 
     @Test
-    fun mismatchedCropRect_fitStart() {
+    public fun mismatchedCropRect_fitStart() {
         assertForMismatchedCropRect(
             PreviewView.ScaleType.FIT_START,
             LayoutDirection.LTR,
@@ -237,7 +237,7 @@
     }
 
     @Test
-    fun mismatchedCropRect_fitCenter() {
+    public fun mismatchedCropRect_fitCenter() {
         assertForMismatchedCropRect(
             PreviewView.ScaleType.FIT_CENTER,
             LayoutDirection.LTR,
@@ -249,7 +249,7 @@
     }
 
     @Test
-    fun mismatchedCropRect_fitEnd() {
+    public fun mismatchedCropRect_fitEnd() {
         assertForMismatchedCropRect(
             PreviewView.ScaleType.FIT_END,
             LayoutDirection.LTR,
@@ -261,7 +261,7 @@
     }
 
     @Test
-    fun mismatchedCropRectFrontCamera_fitStart() {
+    public fun mismatchedCropRectFrontCamera_fitStart() {
         assertForMismatchedCropRect(
             PreviewView.ScaleType.FIT_START,
             LayoutDirection.LTR,
@@ -273,7 +273,7 @@
     }
 
     @Test
-    fun mismatchedCropRect_fillStart() {
+    public fun mismatchedCropRect_fillStart() {
         assertForMismatchedCropRect(
             PreviewView.ScaleType.FILL_START,
             LayoutDirection.LTR,
@@ -285,7 +285,7 @@
     }
 
     @Test
-    fun mismatchedCropRect_fillCenter() {
+    public fun mismatchedCropRect_fillCenter() {
         assertForMismatchedCropRect(
             PreviewView.ScaleType.FILL_CENTER,
             LayoutDirection.LTR,
@@ -297,7 +297,7 @@
     }
 
     @Test
-    fun mismatchedCropRect_fillEnd() {
+    public fun mismatchedCropRect_fillEnd() {
         assertForMismatchedCropRect(
             PreviewView.ScaleType.FILL_END,
             LayoutDirection.LTR,
@@ -309,7 +309,7 @@
     }
 
     @Test
-    fun mismatchedCropRect_fitStartWithRtl_actsLikeFitEnd() {
+    public fun mismatchedCropRect_fitStartWithRtl_actsLikeFitEnd() {
         assertForMismatchedCropRect(
             PreviewView.ScaleType.FIT_START,
             LayoutDirection.RTL,
@@ -347,7 +347,7 @@
     }
 
     @Test
-    fun frontCamera0_transformationIsMirrored() {
+    public fun frontCamera0_transformationIsMirrored() {
         testOffCenterCropRectMirroring(FRONT_CAMERA, CROP_RECT_0, PREVIEW_VIEW_SIZE, 0)
 
         // Assert:
@@ -358,7 +358,7 @@
     }
 
     @Test
-    fun backCamera0_transformationIsNotMirrored() {
+    public fun backCamera0_transformationIsNotMirrored() {
         testOffCenterCropRectMirroring(BACK_CAMERA, CROP_RECT_0, PREVIEW_VIEW_SIZE, 0)
 
         // Assert:
@@ -369,7 +369,7 @@
     }
 
     @Test
-    fun frontCameraRotated90_transformationIsMirrored() {
+    public fun frontCameraRotated90_transformationIsMirrored() {
         testOffCenterCropRectMirroring(
             FRONT_CAMERA, CROP_RECT_90, PIVOTED_PREVIEW_VIEW_SIZE, 90
         )
@@ -382,7 +382,7 @@
     }
 
     @Test
-    fun backCameraRotated90_transformationIsNotMirrored() {
+    public fun backCameraRotated90_transformationIsNotMirrored() {
         testOffCenterCropRectMirroring(BACK_CAMERA, CROP_RECT_90, PIVOTED_PREVIEW_VIEW_SIZE, 90)
 
         // Assert:
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewBitmapTest.java b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewBitmapTest.java
index b8a1f6e..1d086ff 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewBitmapTest.java
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewBitmapTest.java
@@ -35,10 +35,10 @@
 import androidx.camera.view.PreviewView.ImplementationMode;
 import androidx.lifecycle.Observer;
 import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.rules.ActivityScenarioRule;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
 import androidx.test.platform.app.InstrumentationRegistry;
-import androidx.test.rule.ActivityTestRule;
 
 import org.junit.After;
 import org.junit.Assume;
@@ -59,8 +59,9 @@
 public class PreviewViewBitmapTest {
 
     @Rule
-    public final ActivityTestRule<FakeActivity> mActivityRule =
-            new ActivityTestRule<>(FakeActivity.class);
+    public final ActivityScenarioRule<FakeActivity> mActivityRule = new ActivityScenarioRule<>(
+            FakeActivity.class);
+
     @Rule
     public final TestRule mUseCamera = CameraUtil.grantCameraPermissionAndPreTest();
 
@@ -87,6 +88,7 @@
         if (mCameraProvider != null) {
             runOnMainThread(() -> mCameraProvider.unbindAll());
             mCameraProvider.shutdown().get();
+            mCameraProvider = null;
         }
     }
 
@@ -109,7 +111,6 @@
         final FakeLifecycleOwner lifecycleOwner = new FakeLifecycleOwner();
         lifecycleOwner.startAndResume();
 
-
         runOnMainThread(() -> {
             // Act.
             preview.setSurfaceProvider(previewView.getSurfaceProvider());
@@ -277,7 +278,8 @@
             PreviewView previewView = new PreviewView(ApplicationProvider.getApplicationContext());
             previewView.setImplementationMode(mode);
             previewView.setScaleType(scaleType);
-            mActivityRule.getActivity().setContentView(previewView);
+            mActivityRule.getScenario().onActivity(
+                    activity -> activity.setContentView(previewView));
             previewViewAtomicReference.set(previewView);
         });
         return previewViewAtomicReference.get();
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewMeteringPointFactoryDeviceTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewMeteringPointFactoryDeviceTest.kt
index 0e9e196..ef4277f 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewMeteringPointFactoryDeviceTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewMeteringPointFactoryDeviceTest.kt
@@ -33,7 +33,7 @@
  */
 @SmallTest
 @RunWith(Parameterized::class)
-class PreviewViewMeteringPointFactoryDeviceTest(
+public class PreviewViewMeteringPointFactoryDeviceTest(
     private val cropRect: Rect,
     private val rotationDegrees: Int,
     private val surfaceSize: Size,
@@ -45,7 +45,7 @@
     private val expectedMeteringPoint: PointF
 ) {
 
-    companion object {
+    public companion object {
 
         private const val FRONT_CAMERA = true
         private const val BACK_CAMERA = false
@@ -73,7 +73,7 @@
 
         @JvmStatic
         @Parameterized.Parameters
-        fun data(): Collection<Array<Any>> {
+        public fun data(): Collection<Array<Any>> {
 
             return listOf(
                 // Device in sensor orientation without crop rect.
@@ -195,7 +195,7 @@
     private val instrumentation = InstrumentationRegistry.getInstrumentation()
 
     @Test
-    fun verifyMeteringPoint() {
+    public fun verifyMeteringPoint() {
         // Arrange.
         val previewTransformation = PreviewTransformation()
         previewTransformation.scaleType = scaleType
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewStreamStateTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewStreamStateTest.kt
index cccc54e..62990f0 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewStreamStateTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewStreamStateTest.kt
@@ -16,9 +16,7 @@
 
 package androidx.camera.view
 
-import android.app.Activity
 import android.content.Context
-import android.view.View
 import androidx.camera.camera2.Camera2Config
 import androidx.camera.core.CameraSelector
 import androidx.camera.core.CameraX
@@ -32,6 +30,7 @@
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.Observer
 import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.rules.ActivityScenarioRule
 import androidx.test.filters.LargeTest
 import androidx.test.platform.app.InstrumentationRegistry
 import com.google.common.truth.Truth.assertThat
@@ -49,18 +48,19 @@
 
 @LargeTest
 @RunWith(Parameterized::class)
-class PreviewViewStreamStateTest(private val implMode: PreviewView.ImplementationMode) {
-    companion object {
+public class PreviewViewStreamStateTest(private val implMode: PreviewView.ImplementationMode) {
+
+    public companion object {
         @JvmStatic
         @Parameterized.Parameters(name = "{0}")
-        fun data() = arrayOf(
+        public fun data(): Array<PreviewView.ImplementationMode> = arrayOf(
             PreviewView.ImplementationMode.COMPATIBLE,
             PreviewView.ImplementationMode.PERFORMANCE
         )
 
         @BeforeClass
         @JvmStatic
-        fun classSetUp() {
+        public fun classSetUp() {
             CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
         }
     }
@@ -72,49 +72,37 @@
     private lateinit var mCameraProvider: ProcessCameraProvider
 
     @get:Rule
-    val mUseCamera: TestRule = CameraUtil.grantCameraPermissionAndPreTest()
+    public val mUseCamera: TestRule = CameraUtil.grantCameraPermissionAndPreTest()
 
-    @Suppress("DEPRECATION")
     @get:Rule
-    var mActivityRule = androidx.test.rule.ActivityTestRule(
-        FakeActivity::class.java
-    )
-
-    @Throws(Throwable::class)
-    private fun setContentView(view: View) {
-        val activity: Activity = mActivityRule.activity
-        mActivityRule.runOnUiThread { activity.setContentView(view) }
-    }
+    public val mActivityRule: ActivityScenarioRule<FakeActivity> =
+        ActivityScenarioRule(FakeActivity::class.java)
 
     @Before
-    fun setUp() {
+    public fun setUp() {
         Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_BACK))
         CoreAppTestUtil.assumeCompatibleDevice()
 
-        mIsSetup = true
-
         val context = ApplicationProvider.getApplicationContext<Context>()
         val config = Camera2Config.defaultConfig()
         CameraX.initialize(context, config)
-        mLifecycle = FakeLifecycleOwner()
-        mInstrumentation.runOnMainSync {
-            mPreviewView = PreviewView(context)
-        }
-        setContentView(mPreviewView)
-        mInstrumentation.runOnMainSync {
-            mPreviewView.implementationMode = implMode
-        }
 
+        mLifecycle = FakeLifecycleOwner()
+        mActivityRule.scenario.onActivity { activity ->
+            mPreviewView = PreviewView(context)
+            mPreviewView.implementationMode = implMode
+            activity.setContentView(mPreviewView)
+        }
         mCameraProvider = ProcessCameraProvider.getInstance(context).get()
+        mIsSetup = true
     }
 
     @After
-    fun tearDown() {
+    public fun tearDown() {
         if (mIsSetup) {
-            mInstrumentation.runOnMainSync {
-                mCameraProvider.unbindAll()
-            }
+            mInstrumentation.runOnMainSync { mCameraProvider.unbindAll() }
             mCameraProvider.shutdown().get()
+            mIsSetup = false
         }
     }
 
@@ -134,7 +122,7 @@
     }
 
     @Test
-    fun streamState_IDLE_TO_STREAMING_startPreview() {
+    public fun streamState_IDLE_TO_STREAMING_startPreview() {
         assertStreamState(PreviewView.StreamState.IDLE)
 
         startPreview(mLifecycle, mPreviewView, CameraSelector.DEFAULT_BACK_CAMERA)
@@ -144,7 +132,7 @@
     }
 
     @Test
-    fun streamState_STREAMING_TO_IDLE_TO_STREAMING_lifecycleStopAndStart() {
+    public fun streamState_STREAMING_TO_IDLE_TO_STREAMING_lifecycleStopAndStart() {
         startPreview(mLifecycle, mPreviewView, CameraSelector.DEFAULT_BACK_CAMERA)
         mLifecycle.startAndResume()
         assertStreamState(PreviewView.StreamState.STREAMING)
@@ -157,7 +145,7 @@
     }
 
     @Test
-    fun streamState_STREAMING_TO_IDLE_unbindAll() {
+    public fun streamState_STREAMING_TO_IDLE_unbindAll() {
         startPreview(mLifecycle, mPreviewView, CameraSelector.DEFAULT_BACK_CAMERA)
         mLifecycle.startAndResume()
         assertStreamState(PreviewView.StreamState.STREAMING)
@@ -167,7 +155,7 @@
     }
 
     @Test
-    fun streamState_STREAMING_TO_IDLE_unbindPreviewOnly() {
+    public fun streamState_STREAMING_TO_IDLE_unbindPreviewOnly() {
         val preview = startPreview(mLifecycle, mPreviewView, CameraSelector.DEFAULT_BACK_CAMERA)
 
         mLifecycle.startAndResume()
@@ -178,7 +166,7 @@
     }
 
     @Test
-    fun streamState_STREAMING_TO_IDLE_TO_STREAMING_switchCamera() {
+    public fun streamState_STREAMING_TO_IDLE_TO_STREAMING_switchCamera() {
         Assume.assumeTrue(CameraUtil.hasCameraWithLensFacing(CameraSelector.LENS_FACING_FRONT))
 
         startPreview(mLifecycle, mPreviewView, CameraSelector.DEFAULT_BACK_CAMERA)
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewTest.java b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewTest.java
index 8e8b65a..4c81f04 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewTest.java
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewTest.java
@@ -66,11 +66,11 @@
 import androidx.camera.view.test.R;
 import androidx.core.content.ContextCompat;
 import androidx.test.annotation.UiThreadTest;
+import androidx.test.core.app.ActivityScenario;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.LargeTest;
 import androidx.test.platform.app.InstrumentationRegistry;
-import androidx.test.rule.ActivityTestRule;
 import androidx.test.uiautomator.UiDevice;
 import androidx.test.uiautomator.UiObjectNotFoundException;
 import androidx.test.uiautomator.UiSelector;
@@ -107,37 +107,16 @@
     public TestRule mUseCamera = CameraUtil.grantCameraPermissionAndPreTest();
 
     private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
-    @Rule
-    public final ActivityTestRule<FakeActivity> mActivityRule = new ActivityTestRule<>(
-            FakeActivity.class, false, false);
+    private ActivityScenario<FakeActivity> mActivityScenario;
     private final Context mContext = ApplicationProvider.getApplicationContext();
-    private List<SurfaceRequest> mSurfaceRequestList = new ArrayList<>();
+    private final List<SurfaceRequest> mSurfaceRequestList = new ArrayList<>();
     private PreviewView mPreviewView;
     private MeteringPointFactory mMeteringPointFactory;
 
-    private SurfaceRequest createSurfaceRequest(CameraInfo cameraInfo,
-            boolean isRGBA8888Required) {
-        return createSurfaceRequest(DEFAULT_SURFACE_SIZE, cameraInfo, isRGBA8888Required);
-    }
-
-    private SurfaceRequest createSurfaceRequest(CameraInfo cameraInfo) {
-        return createSurfaceRequest(DEFAULT_SURFACE_SIZE, cameraInfo, false);
-    }
-
-    private SurfaceRequest createSurfaceRequest(Size size, CameraInfo cameraInfo,
-            boolean isRGBA8888Required) {
-        FakeCamera fakeCamera = spy(new FakeCamera());
-        when(fakeCamera.getCameraInfo()).thenReturn(cameraInfo);
-
-        SurfaceRequest surfaceRequest = new SurfaceRequest(size, fakeCamera, isRGBA8888Required);
-        mSurfaceRequestList.add(surfaceRequest);
-        return surfaceRequest;
-    }
-
     @Before
     public void setUp() throws CoreAppTestUtil.ForegroundOccupiedError {
         CoreAppTestUtil.prepareDeviceUI(mInstrumentation);
-        mActivityRule.launchActivity(null);
+        mActivityScenario = ActivityScenario.launch(FakeActivity.class);
     }
 
     @After
@@ -149,20 +128,6 @@
         }
     }
 
-    private CameraInfo createCameraInfo(String implementationType) {
-        FakeCameraInfoInternal cameraInfoInternal = new FakeCameraInfoInternal();
-        cameraInfoInternal.setImplementationType(implementationType);
-        return cameraInfoInternal;
-    }
-
-    private CameraInfo createCameraInfo(int rotationDegrees, String implementationType,
-            @CameraSelector.LensFacing int lensFacing) {
-        FakeCameraInfoInternal cameraInfoInternal = new FakeCameraInfoInternal(rotationDegrees,
-                lensFacing);
-        cameraInfoInternal.setImplementationType(implementationType);
-        return cameraInfoInternal;
-    }
-
     @Test
     public void previewViewPinched_pinchToZoomInvokedOnController()
             throws InterruptedException, UiObjectNotFoundException {
@@ -173,7 +138,7 @@
         // Arrange.
         CountDownLatch countDownLatch = new CountDownLatch(1);
         Semaphore semaphore = new Semaphore(0);
-        CameraController fakeController = new CameraController(mInstrumentation.getContext()) {
+        CameraController fakeController = new CameraController(mContext) {
             @Override
             void onPinchToZoom(float pinchToZoomScale) {
                 semaphore.release();
@@ -209,7 +174,7 @@
         // Arrange.
         CountDownLatch countDownLatch = new CountDownLatch(1);
         Semaphore semaphore = new Semaphore(0);
-        CameraController fakeController = new CameraController(mInstrumentation.getContext()) {
+        CameraController fakeController = new CameraController(mContext) {
             @Override
             void onTapToFocus(MeteringPointFactory meteringPointFactory, float x, float y) {
                 semaphore.release();
@@ -368,20 +333,16 @@
     @Test
     public void correctSurfacePixelFormat_whenRGBA8888IsRequired() throws Throwable {
         final CameraInfo cameraInfo = createCameraInfo(CameraInfo.IMPLEMENTATION_TYPE_CAMERA2);
-        SurfaceRequest surfaceRequest = createSurfaceRequest(cameraInfo, true);
+        SurfaceRequest surfaceRequest = createRgb8888SurfaceRequest(cameraInfo);
         ListenableFuture<Surface> future = surfaceRequest.getDeferrableSurface().getSurface();
 
-        mActivityRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
+        mActivityScenario.onActivity(activity -> {
+            final PreviewView previewView = new PreviewView(mContext);
+            setContentView(previewView);
 
-                final PreviewView previewView = new PreviewView(mContext);
-                setContentView(previewView);
-
-                previewView.setImplementationMode(PERFORMANCE);
-                Preview.SurfaceProvider surfaceProvider = previewView.getSurfaceProvider();
-                surfaceProvider.onSurfaceRequested(surfaceRequest);
-            }
+            previewView.setImplementationMode(PERFORMANCE);
+            Preview.SurfaceProvider surfaceProvider = previewView.getSurfaceProvider();
+            surfaceProvider.onSurfaceRequested(surfaceRequest);
         });
         final Surface[] surface = new Surface[1];
         CountDownLatch countDownLatch = new CountDownLatch(1);
@@ -657,12 +618,12 @@
     }
 
     @Test
-    public void redrawsPreview_whenLayoutResized() throws Throwable {
+    public void redrawsPreview_whenLayoutResized() {
         final AtomicReference<PreviewView> previewView = new AtomicReference<>();
         final AtomicReference<FrameLayout> container = new AtomicReference<>();
         final PreviewViewImplementation implementation = mock(TestPreviewViewImplementation.class);
 
-        mActivityRule.runOnUiThread(() -> {
+        mActivityScenario.onActivity(activity -> {
             previewView.set(new PreviewView(mContext));
             previewView.get().mImplementation = implementation;
 
@@ -681,12 +642,12 @@
     }
 
     @Test
-    public void doesNotRedrawPreview_whenDetachedFromWindow() throws Throwable {
+    public void doesNotRedrawPreview_whenDetachedFromWindow() {
         final AtomicReference<PreviewView> previewView = new AtomicReference<>();
         final AtomicReference<FrameLayout> container = new AtomicReference<>();
         final PreviewViewImplementation implementation = mock(TestPreviewViewImplementation.class);
 
-        mActivityRule.runOnUiThread(() -> {
+        mActivityScenario.onActivity(activity -> {
             previewView.set(new PreviewView(mContext));
             previewView.get().mImplementation = implementation;
 
@@ -707,12 +668,12 @@
     }
 
     @Test
-    public void redrawsPreview_whenReattachedToWindow() throws Throwable {
+    public void redrawsPreview_whenReattachedToWindow() {
         final AtomicReference<PreviewView> previewView = new AtomicReference<>();
         final AtomicReference<FrameLayout> container = new AtomicReference<>();
         final PreviewViewImplementation implementation = mock(TestPreviewViewImplementation.class);
 
-        mActivityRule.runOnUiThread(() -> {
+        mActivityScenario.onActivity(activity -> {
             previewView.set(new PreviewView(mContext));
             previewView.get().mImplementation = implementation;
 
@@ -793,7 +754,39 @@
     }
 
     private void setContentView(View view) {
-        mActivityRule.getActivity().setContentView(view);
+        mActivityScenario.onActivity(activity -> activity.setContentView(view));
+    }
+
+    private SurfaceRequest createRgb8888SurfaceRequest(CameraInfo cameraInfo) {
+        return createSurfaceRequest(cameraInfo, true);
+    }
+
+    private SurfaceRequest createSurfaceRequest(CameraInfo cameraInfo) {
+        return createSurfaceRequest(cameraInfo, false);
+    }
+
+    private SurfaceRequest createSurfaceRequest(CameraInfo cameraInfo, boolean isRGBA8888Required) {
+        final FakeCamera fakeCamera = spy(new FakeCamera());
+        when(fakeCamera.getCameraInfo()).thenReturn(cameraInfo);
+
+        final SurfaceRequest surfaceRequest = new SurfaceRequest(DEFAULT_SURFACE_SIZE, fakeCamera,
+                isRGBA8888Required);
+        mSurfaceRequestList.add(surfaceRequest);
+        return surfaceRequest;
+    }
+
+    private CameraInfo createCameraInfo(String implementationType) {
+        FakeCameraInfoInternal cameraInfoInternal = new FakeCameraInfoInternal();
+        cameraInfoInternal.setImplementationType(implementationType);
+        return cameraInfoInternal;
+    }
+
+    private CameraInfo createCameraInfo(int rotationDegrees, String implementationType,
+            @CameraSelector.LensFacing int lensFacing) {
+        FakeCameraInfoInternal cameraInfoInternal = new FakeCameraInfoInternal(rotationDegrees,
+                lensFacing);
+        cameraInfoInternal.setImplementationType(implementationType);
+        return cameraInfoInternal;
     }
 
     private void updateCropRectAndWaitForIdle(Rect cropRect) {
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/SurfaceViewImplementationTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/SurfaceViewImplementationTest.kt
index 4356d85..cc960aa 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/SurfaceViewImplementationTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/SurfaceViewImplementationTest.kt
@@ -16,7 +16,6 @@
 
 package androidx.camera.view
 
-import android.app.Activity
 import android.content.Context
 import android.util.Size
 import android.view.View
@@ -25,6 +24,7 @@
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.testing.fakes.FakeActivity
 import androidx.camera.testing.fakes.FakeCamera
+import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.MediumTest
@@ -32,7 +32,6 @@
 import com.google.common.truth.Truth.assertThat
 import org.junit.After
 import org.junit.Before
-import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import java.util.concurrent.CountDownLatch
@@ -40,37 +39,29 @@
 
 @MediumTest
 @RunWith(AndroidJUnit4::class)
-class SurfaceViewImplementationTest {
+public class SurfaceViewImplementationTest {
 
-    private val ANY_WIDTH = 640
-    private val ANY_HEIGHT = 480
-    private val ANY_SIZE = Size(ANY_WIDTH, ANY_HEIGHT)
+    public companion object {
+        private const val ANY_WIDTH = 640
+        private const val ANY_HEIGHT = 480
+        private val ANY_SIZE = Size(ANY_WIDTH, ANY_HEIGHT)
+    }
 
     private lateinit var mParent: FrameLayout
     private lateinit var mImplementation: SurfaceViewImplementation
-    private val mInstrumentation =
-        InstrumentationRegistry.getInstrumentation()
+    private val mInstrumentation = InstrumentationRegistry.getInstrumentation()
     private lateinit var mSurfaceRequest: SurfaceRequest
     private lateinit var mContext: Context
 
     // Shows the view in activity so that SurfaceView can work normally
-    @Suppress("DEPRECATION")
-    @get:Rule
-    var mActivityRule = androidx.test.rule.ActivityTestRule(
-        FakeActivity::class.java, false, false
-    )
-
-    @Throws(Throwable::class)
-    private fun setContentView(view: View) {
-        val activity: Activity = mActivityRule.activity
-        mActivityRule.runOnUiThread { activity.setContentView(view) }
-    }
+    private lateinit var mActivityScenario: ActivityScenario<FakeActivity>
 
     @Before
-    fun setUp() {
+    public fun setUp() {
         CoreAppTestUtil.prepareDeviceUI(mInstrumentation)
-        mActivityRule.launchActivity(null)
-        mContext = ApplicationProvider.getApplicationContext<Context>()
+
+        mActivityScenario = ActivityScenario.launch(FakeActivity::class.java)
+        mContext = ApplicationProvider.getApplicationContext()
         mParent = FrameLayout(mContext)
         setContentView(mParent)
 
@@ -79,12 +70,12 @@
     }
 
     @After
-    fun tearDown() {
+    public fun tearDown() {
         mSurfaceRequest.deferrableSurface.close()
     }
 
     @Test
-    fun surfaceProvidedSuccessfully() {
+    public fun surfaceProvidedSuccessfully() {
         CoreAppTestUtil.checkKeyguard(mContext)
 
         mInstrumentation.runOnMainSync {
@@ -96,10 +87,10 @@
     }
 
     @Test
-    fun onSurfaceNotInUseListener_isCalledWhenSurfaceIsNotUsedAnyMore() {
+    public fun onSurfaceNotInUseListener_isCalledWhenSurfaceIsNotUsedAnyMore() {
         CoreAppTestUtil.checkKeyguard(mContext)
 
-        var listenerLatch = CountDownLatch(1)
+        val listenerLatch = CountDownLatch(1)
         val onSurfaceNotInUseListener = {
             listenerLatch.countDown()
         }
@@ -114,14 +105,14 @@
     }
 
     @Test
-    fun onSurfaceNotInUseListener_isCalledWhenSurfaceRequestIsCancelled() {
-        var listenerLatch = CountDownLatch(1)
+    public fun onSurfaceNotInUseListener_isCalledWhenSurfaceRequestIsCancelled() {
+        val listenerLatch = CountDownLatch(1)
         val onSurfaceNotInUseListener = {
             listenerLatch.countDown()
         }
 
         // Not attach the mParent to the window so that the Surface cannot be created.
-        setContentView(View(ApplicationProvider.getApplicationContext()))
+        setContentView(View(mContext))
 
         mInstrumentation.runOnMainSync {
             mImplementation.onSurfaceRequested(mSurfaceRequest, onSurfaceNotInUseListener)
@@ -135,8 +126,13 @@
     }
 
     @Test
-    fun waitForNextFrame_futureCompletesImmediately() {
+    public fun waitForNextFrame_futureCompletesImmediately() {
         val future = mImplementation.waitForNextFrame()
         future.get(20, TimeUnit.MILLISECONDS)
     }
+
+    @Throws(Throwable::class)
+    private fun setContentView(view: View) {
+        mActivityScenario.onActivity { activity -> activity.setContentView(view) }
+    }
 }
\ No newline at end of file
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/TextureViewImplementationTest.java b/camera/camera-view/src/androidTest/java/androidx/camera/view/TextureViewImplementationTest.java
index 1074d8d..961cab6 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/TextureViewImplementationTest.java
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/TextureViewImplementationTest.java
@@ -149,7 +149,7 @@
         SurfaceRequest surfaceRequest = getSurfaceRequest();
         CountDownLatch latchForSurfaceNotInUse = new CountDownLatch(1);
         PreviewViewImplementation.OnSurfaceNotInUseListener onSurfaceNotInUseListener =
-                () -> latchForSurfaceNotInUse.countDown();
+                latchForSurfaceNotInUse::countDown;
 
         mImplementation.onSurfaceRequested(surfaceRequest, onSurfaceNotInUseListener);
         DeferrableSurface deferrableSurface = surfaceRequest.getDeferrableSurface();
@@ -172,7 +172,7 @@
         SurfaceRequest surfaceRequest = getSurfaceRequest();
         CountDownLatch latchForSurfaceNotInUse = new CountDownLatch(1);
         PreviewViewImplementation.OnSurfaceNotInUseListener onSurfaceNotInUseListener =
-                () -> latchForSurfaceNotInUse.countDown();
+                latchForSurfaceNotInUse::countDown;
 
         mImplementation.onSurfaceRequested(surfaceRequest, onSurfaceNotInUseListener);
         DeferrableSurface deferrableSurface = surfaceRequest.getDeferrableSurface();
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraControllerFragment.java b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraControllerFragment.java
index 173165f..e833abd 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraControllerFragment.java
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraControllerFragment.java
@@ -115,11 +115,6 @@
         image.close();
     };
 
-    @Override
-    public void onAttach(@NonNull Context context) {
-        super.onAttach(context);
-    }
-
     @NonNull
     @Override
     @UseExperimental(markerClass = ExperimentalVideo.class)
@@ -241,7 +236,7 @@
         view.findViewById(R.id.video_record).setOnClickListener(v -> {
             try {
                 String videoFileName = "video_" + System.currentTimeMillis();
-                ContentResolver resolver = getContext().getContentResolver();
+                ContentResolver resolver = requireContext().getContentResolver();
                 ContentValues contentValues = new ContentValues();
                 contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4");
                 contentValues.put(MediaStore.Video.Media.TITLE, videoFileName);
@@ -326,7 +321,9 @@
         if (mExecutorService != null) {
             mExecutorService.shutdown();
         }
-        mSensorRotationListener.disable();
+        if (mSensorRotationListener != null) {
+            mSensorRotationListener.disable();
+        }
     }
 
     void checkFailedFuture(ListenableFuture<Void> voidFuture) {
@@ -347,7 +344,7 @@
     // Synthetic access
     @SuppressWarnings("WeakerAccess")
     void toast(String message) {
-        getActivity().runOnUiThread(
+        requireActivity().runOnUiThread(
                 () -> Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show());
     }
 
@@ -373,8 +370,9 @@
     @UseExperimental(markerClass = ExperimentalVideo.class)
     private void updateUiText() {
         mFlashMode.setText(getFlashModeTextResId());
-        mCameraToggle.setChecked(mCameraController.getCameraSelector().getLensFacing()
-                == CameraSelector.LENS_FACING_BACK);
+        final Integer lensFacing = mCameraController.getCameraSelector().getLensFacing();
+        mCameraToggle.setChecked(
+                lensFacing != null && lensFacing == CameraSelector.LENS_FACING_BACK);
         mVideoEnabledToggle.setChecked(mCameraController.isVideoCaptureEnabled());
         mPinchToZoomToggle.setChecked(mCameraController.isPinchToZoomEnabled());
         mTapToFocusToggle.setChecked(mCameraController.isTapToFocusEnabled());
@@ -510,7 +508,7 @@
         contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
         ImageCapture.OutputFileOptions outputFileOptions =
                 new ImageCapture.OutputFileOptions.Builder(
-                        getContext().getContentResolver(),
+                        requireContext().getContentResolver(),
                         MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                         contentValues).build();
         mCameraController.takePicture(outputFileOptions, mExecutorService, callback);
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java
index 74878d8..c23de8b 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java
@@ -17,6 +17,7 @@
 package androidx.camera.integration.view;
 
 import android.Manifest;
+import android.annotation.SuppressLint;
 import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.Bundle;
@@ -28,7 +29,9 @@
 import android.widget.Toast;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.app.ActivityCompat;
 import androidx.core.content.ContextCompat;
 import androidx.fragment.app.Fragment;
 
@@ -53,7 +56,7 @@
     private Mode mMode = Mode.CAMERA_VIEW;
 
     @Override
-    protected void onCreate(Bundle savedInstanceState) {
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         // Get extra option for checking whether it need to be implemented with PreviewView
@@ -77,7 +80,8 @@
                 if (allPermissionsGranted()) {
                     startFragment();
                 } else if (!mCheckedPermissions) {
-                    requestPermissions(REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS);
+                    ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS,
+                            REQUEST_CODE_PERMISSIONS);
                     mCheckedPermissions = true;
                 }
             } else {
@@ -105,6 +109,7 @@
         return true;
     }
 
+    @SuppressLint("NonConstantResourceId")
     @Override
     public boolean onOptionsItemSelected(@NonNull MenuItem item) {
         switch (item.getItemId()) {
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java
index 97e5053..9b1a8e2 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java
@@ -68,7 +68,8 @@
 public class PreviewViewFragment extends Fragment {
 
     /** Scale types of ImageView that map to the PreviewView scale types. */
-    private static final ImageView.ScaleType[] IMAGE_VIEW_SCALE_TYPES =
+    // Synthetic access
+    static final ImageView.ScaleType[] IMAGE_VIEW_SCALE_TYPES =
             {ImageView.ScaleType.FIT_CENTER, ImageView.ScaleType.FIT_CENTER,
                     ImageView.ScaleType.FIT_CENTER, ImageView.ScaleType.FIT_START,
                     ImageView.ScaleType.FIT_CENTER, ImageView.ScaleType.FIT_END};
@@ -182,7 +183,8 @@
         });
     }
 
-    void updateTargetRotationButtonText(Button rotationButton) {
+    @SuppressLint("SetTextI18n")
+    void updateTargetRotationButtonText(final @NonNull Button rotationButton) {
         switch (mPreview.getTargetRotation()) {
             case Surface.ROTATION_0:
                 rotationButton.setText("ROTATION_0");
@@ -225,7 +227,7 @@
             // Get extra option for setting initial camera direction
             boolean isCameraDirectionValid = false;
             String cameraDirectionString = null;
-            Bundle bundle = getActivity().getIntent().getExtras();
+            Bundle bundle = requireActivity().getIntent().getExtras();
             if (bundle != null) {
                 cameraDirectionString = bundle.getString(INTENT_EXTRA_CAMERA_DIRECTION);
                 isCameraDirectionValid =
@@ -330,6 +332,7 @@
         setUpFocusAndMetering(camera);
     }
 
+    @SuppressLint("ClickableViewAccessibility")
     private void setUpFocusAndMetering(@NonNull final Camera camera) {
         mPreviewView.setOnTouchListener((view, motionEvent) -> {
             switch (motionEvent.getAction()) {
@@ -414,7 +417,7 @@
     // like TextureView.SurfaceTextureListener#onSurfaceTextureUpdated but it will require to add
     // API in PreviewView which is not a good idea. And we use OnPreDrawListener instead of
     // OnDrawListener because OnDrawListener is not invoked on some low API level devices.
-    private ViewTreeObserver.OnPreDrawListener mOnPreDrawListener = () -> {
+    private final ViewTreeObserver.OnPreDrawListener mOnPreDrawListener = () -> {
         if (mPreviewUpdatingLatch != null) {
             mPreviewUpdatingLatch.countDown();
         }
@@ -439,5 +442,5 @@
     void setPreviewUpdatingLatch(@NonNull CountDownLatch previewUpdatingLatch) {
         mPreviewUpdatingLatch = previewUpdatingLatch;
     }
-    // end region
+    // endregion
 }