diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java
index fb23a5f..92a5e58 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java
@@ -20,7 +20,7 @@
 import static android.hardware.camera2.cts.helpers.Preconditions.*;
 import static android.hardware.camera2.cts.helpers.AssertHelpers.*;
 import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
 
 import android.content.Context;
 import android.graphics.ImageFormat;
@@ -56,8 +56,8 @@
 import android.view.Surface;
 
 import com.android.ex.camera2.blocking.BlockingCameraManager.BlockingOpenException;
-import com.android.ex.camera2.blocking.BlockingStateListener;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -78,8 +78,8 @@
     private CameraManager mCameraManager;
     private CameraDevice mCamera;
     private CameraCaptureSession mSession;
-    private BlockingStateListener mCameraListener;
-    private BlockingSessionListener mSessionListener;
+    private BlockingStateCallback mCameraListener;
+    private BlockingSessionCallback mSessionListener;
 
     private String[] mCameraIds;
 
@@ -107,7 +107,7 @@
         mHandlerThread = new HandlerThread("AllocationTest");
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
-        mCameraListener = new BlockingStateListener();
+        mCameraListener = new BlockingStateCallback();
 
         mCameraIterable = new CameraIterable();
         mSizeIterable = new SizeIterable();
@@ -360,7 +360,7 @@
         assertNotNull("Failed to get Surface", cameraTarget);
         outputSurfaces.add(cameraTarget);
 
-        mSessionListener = new BlockingSessionListener();
+        mSessionListener = new BlockingSessionCallback();
         mCamera.createCaptureSession(outputSurfaces, mSessionListener, mHandler);
         mSession = mSessionListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
         CaptureRequest.Builder captureBuilder =
@@ -384,7 +384,7 @@
         checkNotNull("request", request);
         checkNotNull("graph", graph);
 
-        mSession.capture(request, new CameraCaptureSession.CaptureListener() {
+        mSession.capture(request, new CameraCaptureSession.CaptureCallback() {
             @Override
             public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
                     TotalCaptureResult result) {
@@ -402,7 +402,7 @@
         if (VERBOSE) Log.v(TAG, "Stopping capture and waiting for idle");
         // Stop repeat, wait for captures to complete, and disconnect from surfaces
         mSession.close();
-        mSessionListener.getStateWaiter().waitForState(BlockingSessionListener.SESSION_CLOSED,
+        mSessionListener.getStateWaiter().waitForState(BlockingSessionCallback.SESSION_CLOSED,
                 SESSION_CLOSE_TIMEOUT_MS);
         mSession = null;
         mSessionListener = null;
@@ -824,7 +824,7 @@
 
             // TODO: start capture, i.e. configureOutputs
 
-            SimpleCaptureListener listener = new SimpleCaptureListener();
+            SimpleCaptureCallback listener = new SimpleCaptureCallback();
 
             if (!repeating) {
                 for (int i = 0; i < count; ++i) {
@@ -835,7 +835,7 @@
             }
 
             // Assume that the device is already IDLE.
-            mSessionListener.getStateWaiter().waitForState(BlockingSessionListener.SESSION_ACTIVE,
+            mSessionListener.getStateWaiter().waitForState(BlockingSessionCallback.SESSION_ACTIVE,
                     CAMERA_ACTIVE_TIMEOUT_MS);
 
             for (int i = 0; i < count; ++i) {
@@ -851,7 +851,7 @@
             if (repeating) {
                 mSession.stopRepeating();
                 mSessionListener.getStateWaiter().waitForState(
-                    BlockingSessionListener.SESSION_READY, CAMERA_IDLE_TIMEOUT_MS);
+                    BlockingSessionCallback.SESSION_READY, CAMERA_IDLE_TIMEOUT_MS);
             }
 
             // TODO: Make a Configure decorator or some such for configureOutputs
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
index 7ddae65..7f3c652 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
@@ -17,8 +17,8 @@
 package android.hardware.camera2.cts;
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
-import static com.android.ex.camera2.blocking.BlockingSessionListener.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
+import static com.android.ex.camera2.blocking.BlockingSessionCallback.*;
 import static org.mockito.Mockito.*;
 import static android.hardware.camera2.CaptureRequest.*;
 
@@ -40,8 +40,8 @@
 import android.util.Range;
 import android.view.Surface;
 
-import com.android.ex.camera2.blocking.BlockingSessionListener;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
 import com.android.ex.camera2.utils.StateWaiter;
 
 import org.mockito.ArgumentMatcher;
@@ -65,9 +65,9 @@
 
     private CameraCaptureSession mSession;
 
-    private BlockingStateListener mCameraMockListener;
+    private BlockingStateCallback mCameraMockListener;
     private int mLatestDeviceState = STATE_UNINITIALIZED;
-    private BlockingSessionListener mSessionMockListener;
+    private BlockingSessionCallback mSessionMockListener;
     private StateWaiter mSessionWaiter;
     private int mLatestSessionState = -1; // uninitialized
 
@@ -95,7 +95,7 @@
          * Use spy object here since we want to use the SimpleDeviceListener callback
          * implementation (spy doesn't stub the functions unless we ask it to do so).
          */
-        mCameraMockListener = spy(new BlockingStateListener());
+        mCameraMockListener = spy(new BlockingStateCallback());
     }
 
     @Override
@@ -405,7 +405,7 @@
         // A cascade of Device->Session->Capture listeners, each of which invokes at least one
         // method on the camera device or session.
 
-        class ChainedCaptureListener extends CameraCaptureSession.CaptureListener {
+        class ChainedCaptureCallback extends CameraCaptureSession.CaptureCallback {
             public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
                     TotalCaptureResult result) {
                 try {
@@ -444,8 +444,8 @@
             }
         }
 
-        class ChainedSessionListener extends CameraCaptureSession.StateListener {
-            private final ChainedCaptureListener mCaptureListener = new ChainedCaptureListener();
+        class ChainedSessionListener extends CameraCaptureSession.StateCallback {
+            private final ChainedCaptureCallback mCaptureCallback = new ChainedCaptureCallback();
 
             public void onConfigured(CameraCaptureSession session) {
                 try {
@@ -456,7 +456,7 @@
                     session.getDevice();
                     session.abortCaptures();
                     // The important call for the next level of chaining
-                    session.capture(request.build(), mCaptureListener, mHandler);
+                    session.capture(request.build(), mCaptureCallback, mHandler);
                     // Some more calls
                     session.setRepeatingRequest(request.build(),
                             /*listener*/ null, /*handler*/ null);
@@ -479,7 +479,7 @@
             }
         }
 
-        class ChainedCameraListener extends CameraDevice.StateListener {
+        class ChainedCameraListener extends CameraDevice.StateCallback {
             private final ChainedSessionListener mSessionListener = new ChainedSessionListener();
 
             public CameraDevice cameraDevice;
@@ -760,19 +760,19 @@
         CaptureRequest.Builder requestBuilder = mCamera.createCaptureRequest(template);
         assertNotNull("Failed to create capture request", requestBuilder);
         requestBuilder.addTarget(mReaderSurface);
-        CameraCaptureSession.CaptureListener mockCaptureListener =
-                mock(CameraCaptureSession.CaptureListener.class);
+        CameraCaptureSession.CaptureCallback mockCaptureCallback =
+                mock(CameraCaptureSession.CaptureCallback.class);
 
         if (VERBOSE) {
             Log.v(TAG, String.format("Capturing shot for device %s, template %d",
                     id, template));
         }
 
-        startCapture(requestBuilder.build(), repeating, mockCaptureListener, mHandler);
+        startCapture(requestBuilder.build(), repeating, mockCaptureCallback, mHandler);
         waitForSessionState(SESSION_ACTIVE, SESSION_ACTIVE_TIMEOUT_MS);
 
         int expectedCaptureResultCount = repeating ? REPEATING_CAPTURE_EXPECTED_RESULT_COUNT : 1;
-        verifyCaptureResults(mockCaptureListener, expectedCaptureResultCount);
+        verifyCaptureResults(mockCaptureCallback, expectedCaptureResultCount);
 
         if (repeating) {
             if (abort) {
@@ -802,18 +802,18 @@
             requestBuilder.addTarget(mReaderSurface);
             requests.add(requestBuilder.build());
         }
-        CameraCaptureSession.CaptureListener mockCaptureListener =
-                mock(CameraCaptureSession.CaptureListener.class);
+        CameraCaptureSession.CaptureCallback mockCaptureCallback =
+                mock(CameraCaptureSession.CaptureCallback.class);
 
         if (VERBOSE) {
             Log.v(TAG, String.format("Capturing burst shot for device %s", id));
         }
 
         if (!repeating) {
-            mSession.captureBurst(requests, mockCaptureListener, mHandler);
+            mSession.captureBurst(requests, mockCaptureCallback, mHandler);
         }
         else {
-            mSession.setRepeatingBurst(requests, mockCaptureListener, mHandler);
+            mSession.setRepeatingBurst(requests, mockCaptureCallback, mHandler);
         }
         waitForSessionState(SESSION_ACTIVE, SESSION_READY_TIMEOUT_MS);
 
@@ -822,7 +822,7 @@
             expectedResultCount *= REPEATING_CAPTURE_EXPECTED_RESULT_COUNT;
         }
 
-        verifyCaptureResults(mockCaptureListener, expectedResultCount);
+        verifyCaptureResults(mockCaptureCallback, expectedResultCount);
 
         if (repeating) {
             if (abort) {
@@ -854,7 +854,7 @@
         }
 
         // Create a new session listener each time, it's not reusable across cameras
-        mSessionMockListener = spy(new BlockingSessionListener());
+        mSessionMockListener = spy(new BlockingSessionCallback());
         mSessionWaiter = mSessionMockListener.getStateWaiter();
 
         List<Surface> outputSurfaces = new ArrayList<>(Arrays.asList(mReaderSurface));
@@ -876,7 +876,7 @@
     }
 
     private void verifyCaptureResults(
-            CameraCaptureSession.CaptureListener mockListener,
+            CameraCaptureSession.CaptureCallback mockListener,
             int expectResultCount) {
         final int TIMEOUT_PER_RESULT_MS = 2000;
         // Should receive expected number of capture results.
@@ -1304,11 +1304,11 @@
      *
      * @param request The {@link #CaptureRequest} to be captured.
      * @param repeating If the capture is single capture or repeating.
-     * @param listener The {@link #CaptureListener} camera device used to notify callbacks.
+     * @param listener The {@link #CaptureCallback} camera device used to notify callbacks.
      * @param handler The handler camera device used to post callbacks.
      */
     protected void startCapture(CaptureRequest request, boolean repeating,
-            CameraCaptureSession.CaptureListener listener, Handler handler)
+            CameraCaptureSession.CaptureCallback listener, Handler handler)
                     throws CameraAccessException {
         if (VERBOSE) Log.v(TAG, "Starting capture from session");
 
@@ -1321,7 +1321,7 @@
 
     /**
      * Close a {@link #CameraCaptureSession capture session}; blocking until
-     * the close finishes with a transition to {@link CameraCaptureSession.StateListener#onClosed}.
+     * the close finishes with a transition to {@link CameraCaptureSession.StateCallback#onClosed}.
      */
     protected void closeSession() {
         if (mSession == null) {
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
index a8c9896..192fb85 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
@@ -25,16 +25,16 @@
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraDevice;
-import android.hardware.camera2.CameraDevice.StateListener;
+import android.hardware.camera2.CameraDevice.StateCallback;
 import android.hardware.camera2.CameraManager;
-import android.hardware.camera2.cts.CameraTestUtils.MockStateListener;
+import android.hardware.camera2.cts.CameraTestUtils.MockStateCallback;
 import android.hardware.camera2.cts.helpers.CameraErrorCollector;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.test.AndroidTestCase;
 import android.util.Log;
 
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
 
 import org.mockito.ArgumentCaptor;
 import org.mockito.InOrder;
@@ -56,7 +56,7 @@
     private NoopCameraListener mListener;
     private HandlerThread mHandlerThread;
     private Handler mHandler;
-    private BlockingStateListener mCameraListener;
+    private BlockingStateCallback mCameraListener;
     private CameraErrorCollector mCollector;
 
     @Override
@@ -81,7 +81,7 @@
          */
         System.setProperty("dexmaker.dexcache", getContext().getCacheDir().toString());
 
-        mCameraListener = spy(new BlockingStateListener());
+        mCameraListener = spy(new BlockingStateCallback());
 
         mHandlerThread = new HandlerThread(TAG);
         mHandlerThread.start();
@@ -205,13 +205,13 @@
             for (int j = 0; j < NUM_CAMERA_REOPENS; j++) {
                 CameraDevice camera = null;
                 try {
-                    MockStateListener mockListener = MockStateListener.mock();
-                    mCameraListener = new BlockingStateListener(mockListener);
+                    MockStateCallback mockListener = MockStateCallback.mock();
+                    mCameraListener = new BlockingStateCallback(mockListener);
 
                     mCameraManager.openCamera(ids[i], mCameraListener, mHandler);
 
                     // Block until unConfigured
-                    mCameraListener.waitForState(BlockingStateListener.STATE_OPENED,
+                    mCameraListener.waitForState(BlockingStateCallback.STATE_OPENED,
                             CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
 
                     // Ensure state transitions are in right order:
@@ -241,19 +241,19 @@
         }
 
         List<CameraDevice> cameraList = new ArrayList<CameraDevice>();
-        List<MockStateListener> listenerList = new ArrayList<MockStateListener>();
-        List<BlockingStateListener> blockingListenerList = new ArrayList<BlockingStateListener>();
+        List<MockStateCallback> listenerList = new ArrayList<MockStateCallback>();
+        List<BlockingStateCallback> blockingListenerList = new ArrayList<BlockingStateCallback>();
         try {
             for (int i = 0; i < ids.length; i++) {
                 // Ignore state changes from other cameras
-                MockStateListener mockListener = MockStateListener.mock();
-                mCameraListener = new BlockingStateListener(mockListener);
+                MockStateCallback mockListener = MockStateCallback.mock();
+                mCameraListener = new BlockingStateCallback(mockListener);
 
                 /**
                  * Track whether or not we got a synchronous error from openCamera.
                  *
                  * A synchronous error must also be accompanied by an asynchronous
-                 * StateListener#onError callback.
+                 * StateCallback#onError callback.
                  */
                 boolean expectingError = false;
 
@@ -271,16 +271,16 @@
                 }
 
                 List<Integer> expectedStates = new ArrayList<Integer>();
-                expectedStates.add(BlockingStateListener.STATE_OPENED);
-                expectedStates.add(BlockingStateListener.STATE_ERROR);
+                expectedStates.add(BlockingStateCallback.STATE_OPENED);
+                expectedStates.add(BlockingStateCallback.STATE_ERROR);
                 int state = mCameraListener.waitForAnyOfStates(
                         expectedStates, CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
 
                 // It's possible that we got an asynchronous error transition only. This is ok.
                 if (expectingError) {
                     assertEquals("Throwing a CAMERA_ERROR exception must be accompanied with a " +
-                            "StateListener#onError callback",
-                            BlockingStateListener.STATE_ERROR, state);
+                            "StateCallback#onError callback",
+                            BlockingStateCallback.STATE_ERROR, state);
                 }
 
                 /**
@@ -297,7 +297,7 @@
                  */
 
                 CameraDevice camera;
-                if (state == BlockingStateListener.STATE_ERROR) {
+                if (state == BlockingStateCallback.STATE_ERROR) {
                     // Camera did not open because too many other cameras were opened
                     // => onError called exactly once with a non-null camera
                     assertTrue("At least one camera must be opened successfully",
@@ -309,13 +309,13 @@
                     verify(mockListener)
                             .onError(
                                     argument.capture(),
-                                    eq(CameraDevice.StateListener.ERROR_MAX_CAMERAS_IN_USE));
+                                    eq(CameraDevice.StateCallback.ERROR_MAX_CAMERAS_IN_USE));
                     verifyNoMoreInteractions(mockListener);
 
                     camera = argument.getValue();
                     assertNotNull("Expected a non-null camera for the error transition for ID: "
                             + ids[i], camera);
-                } else if (state == BlockingStateListener.STATE_OPENED) {
+                } else if (state == BlockingStateCallback.STATE_OPENED) {
                     // Camera opened successfully.
                     // => onOpened called exactly once
                     camera = verifyCameraStateOpened(cameraId,
@@ -334,9 +334,9 @@
             for (CameraDevice camera : cameraList) {
                 camera.close();
             }
-            for (BlockingStateListener blockingListener : blockingListenerList) {
+            for (BlockingStateCallback blockingListener : blockingListenerList) {
                 blockingListener.waitForState(
-                        BlockingStateListener.STATE_CLOSED,
+                        BlockingStateCallback.STATE_CLOSED,
                         CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
             }
         }
@@ -346,7 +346,7 @@
          * after closing the cameras.
          */
         int i = 0;
-        for (MockStateListener listener : listenerList) {
+        for (MockStateCallback listener : listenerList) {
             CameraDevice camera = cameraList.get(i);
 
             verify(listener).onClosed(eq(camera));
@@ -373,7 +373,7 @@
      * @return The camera device (non-{@code null}).
      */
     private static CameraDevice verifyCameraStateOpened(String cameraId,
-            MockStateListener listener) {
+            MockStateCallback listener) {
         ArgumentCaptor<CameraDevice> argument =
                 ArgumentCaptor.forClass(CameraDevice.class);
         InOrder inOrder = inOrder(listener);
@@ -411,13 +411,13 @@
             mCollector.setCameraId(ids[i]);
 
             try {
-                MockStateListener mockSuccessListener = MockStateListener.mock();
-                MockStateListener mockFailListener = MockStateListener.mock();
+                MockStateCallback mockSuccessListener = MockStateCallback.mock();
+                MockStateCallback mockFailListener = MockStateCallback.mock();
 
-                BlockingStateListener successListener =
-                        new BlockingStateListener(mockSuccessListener);
-                BlockingStateListener failListener =
-                        new BlockingStateListener(mockFailListener);
+                BlockingStateCallback successListener =
+                        new BlockingStateCallback(mockSuccessListener);
+                BlockingStateCallback failListener =
+                        new BlockingStateCallback(mockFailListener);
 
                 mCameraManager.openCamera(ids[i], successListener, mHandler);
 
@@ -434,7 +434,7 @@
                             CameraAccessException.CAMERA_ERROR, e.getReason());
                 }
 
-                successListener.waitForState(BlockingStateListener.STATE_OPENED,
+                successListener.waitForState(BlockingStateCallback.STATE_OPENED,
                         CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
                 // Have to get the successCamera here, otherwise, it won't be
                 // closed if STATE_ERROR timeout exception occurs.
@@ -442,7 +442,7 @@
                         ArgumentCaptor.forClass(CameraDevice.class);
                 verify(mockSuccessListener, atLeastOnce()).onOpened(argument.capture());
 
-                failListener.waitForState(BlockingStateListener.STATE_ERROR,
+                failListener.waitForState(BlockingStateCallback.STATE_ERROR,
                         CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
 
                 successCamera = verifyCameraStateOpened(
@@ -451,7 +451,7 @@
                 verify(mockFailListener)
                         .onError(
                                 and(notNull(CameraDevice.class), not(eq(successCamera))),
-                                eq(StateListener.ERROR_CAMERA_IN_USE));
+                                eq(StateCallback.ERROR_CAMERA_IN_USE));
                 verifyNoMoreInteractions(mockFailListener);
             } finally {
                 if (successCamera != null) {
@@ -461,7 +461,7 @@
         }
     }
 
-    private class NoopCameraListener extends CameraManager.AvailabilityListener {
+    private class NoopCameraListener extends CameraManager.AvailabilityCallback {
         @Override
         public void onCameraAvailable(String cameraId) {
             // No-op
@@ -480,11 +480,11 @@
      * a listener that isn't registered should have no effect.
      */
     public void testCameraManagerListener() throws Exception {
-        mCameraManager.removeAvailabilityListener(mListener);
-        mCameraManager.addAvailabilityListener(mListener, mHandler);
-        mCameraManager.addAvailabilityListener(mListener, mHandler);
-        mCameraManager.removeAvailabilityListener(mListener);
-        mCameraManager.removeAvailabilityListener(mListener);
+        mCameraManager.unregisterAvailabilityCallback(mListener);
+        mCameraManager.registerAvailabilityCallback(mListener, mHandler);
+        mCameraManager.registerAvailabilityCallback(mListener, mHandler);
+        mCameraManager.unregisterAvailabilityCallback(mListener);
+        mCameraManager.unregisterAvailabilityCallback(mListener);
 
         // TODO: test the listener callbacks
     }
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
index 1f4fc49..2e072d5 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
@@ -16,7 +16,7 @@
 
 package android.hardware.camera2.cts;
 
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
 
 import android.graphics.BitmapFactory;
 import android.graphics.ImageFormat;
@@ -43,8 +43,8 @@
 
 import com.android.ex.camera2.blocking.BlockingCameraManager;
 import com.android.ex.camera2.blocking.BlockingCameraManager.BlockingOpenException;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
 import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
 
 import junit.framework.Assert;
@@ -195,7 +195,7 @@
         }
     }
 
-    public static class SimpleCaptureListener extends CameraCaptureSession.CaptureListener {
+    public static class SimpleCaptureCallback extends CameraCaptureSession.CaptureCallback {
         private final LinkedBlockingQueue<CaptureResult> mQueue =
                 new LinkedBlockingQueue<CaptureResult>();
 
@@ -292,7 +292,7 @@
      *            If opening times out. Typically unrecoverable.
      */
     public static CameraDevice openCamera(CameraManager manager, String cameraId,
-            CameraDevice.StateListener listener, Handler handler) throws CameraAccessException,
+            CameraDevice.StateCallback listener, Handler handler) throws CameraAccessException,
             BlockingOpenException {
 
         /**
@@ -338,9 +338,9 @@
      */
     public static CameraCaptureSession configureCameraSession(CameraDevice camera,
             List<Surface> outputSurfaces,
-            CameraCaptureSession.StateListener listener, Handler handler)
+            CameraCaptureSession.StateCallback listener, Handler handler)
             throws CameraAccessException {
-        BlockingSessionListener sessionListener = new BlockingSessionListener(listener);
+        BlockingSessionCallback sessionListener = new BlockingSessionCallback(listener);
         camera.createCaptureSession(outputSurfaces, sessionListener, handler);
 
         return sessionListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
@@ -781,19 +781,19 @@
     }
 
     /**
-     * Provide a mock for {@link CameraDevice.StateListener}.
+     * Provide a mock for {@link CameraDevice.StateCallback}.
      *
-     * <p>Only useful because mockito can't mock {@link CameraDevice.StateListener} which is an
+     * <p>Only useful because mockito can't mock {@link CameraDevice.StateCallback} which is an
      * abstract class.</p>
      *
      * <p>
      * Use this instead of other classes when needing to verify interactions, since
-     * trying to spy on {@link BlockingStateListener} (or others) will cause unnecessary extra
+     * trying to spy on {@link BlockingStateCallback} (or others) will cause unnecessary extra
      * interactions which will cause false test failures.
      * </p>
      *
      */
-    public static class MockStateListener extends CameraDevice.StateListener {
+    public static class MockStateCallback extends CameraDevice.StateCallback {
 
         @Override
         public void onOpened(CameraDevice camera) {
@@ -807,13 +807,13 @@
         public void onError(CameraDevice camera, int error) {
         }
 
-        private MockStateListener() {}
+        private MockStateCallback() {}
 
         /**
-         * Create a Mockito-ready mocked StateListener.
+         * Create a Mockito-ready mocked StateCallback.
          */
-        public static MockStateListener mock() {
-            return Mockito.spy(new MockStateListener());
+        public static MockStateCallback mock() {
+            return Mockito.spy(new MockStateCallback());
         }
     }
 
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
index fd4f338..3d55c85 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
@@ -27,7 +27,7 @@
 import android.hardware.camera2.CameraMetadata;
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
-import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureListener;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
 import android.hardware.camera2.params.ColorSpaceTransform;
 import android.hardware.camera2.params.Face;
@@ -138,7 +138,7 @@
                     continue;
                 }
 
-                SimpleCaptureListener listener = new SimpleCaptureListener();
+                SimpleCaptureCallback listener = new SimpleCaptureCallback();
                 CaptureRequest.Builder requestBuilder =
                         mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
 
@@ -156,7 +156,7 @@
 
                 // Double the exposure time and gain, with black level still being locked.
                 changeExposure(requestBuilder, DEFAULT_EXP_TIME_NS * 2, DEFAULT_SENSITIVITY * 2);
-                listener = new SimpleCaptureListener();
+                listener = new SimpleCaptureCallback();
                 startPreview(requestBuilder, previewSz, listener);
                 waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 // Allow at most one lock OFF state as the exposure is changed once.
@@ -191,7 +191,7 @@
                     continue;
                 }
 
-                SimpleCaptureListener listener = new SimpleCaptureListener();
+                SimpleCaptureCallback listener = new SimpleCaptureCallback();
                 CaptureRequest.Builder requestBuilder =
                         mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
 
@@ -204,7 +204,7 @@
                 Size previewSz =
                         getMaxPreviewSize(mCamera.getId(), mCameraManager, PREVIEW_SIZE_BOUND);
 
-                listener = new SimpleCaptureListener();
+                listener = new SimpleCaptureCallback();
                 startPreview(requestBuilder, previewSz, listener);
                 waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_OFF);
@@ -213,7 +213,7 @@
                 // should output valid maps.
                 requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_FAST);
 
-                listener = new SimpleCaptureListener();
+                listener = new SimpleCaptureCallback();
                 startPreview(requestBuilder, previewSz, listener);
                 waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 // Allow at most one lock OFF state as the exposure is changed once.
@@ -223,7 +223,7 @@
                 // should output valid maps.
                 requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_HIGH_QUALITY);
 
-                listener = new SimpleCaptureListener();
+                listener = new SimpleCaptureCallback();
                 startPreview(requestBuilder, previewSz, listener);
                 waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_HIGH_QUALITY);
@@ -309,7 +309,7 @@
             try {
                 openDevice(mCameraIds[i]);
 
-                SimpleCaptureListener listener = new SimpleCaptureListener();
+                SimpleCaptureCallback listener = new SimpleCaptureCallback();
                 CaptureRequest.Builder requestBuilder =
                         mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
 
@@ -555,12 +555,12 @@
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
         int[] availableModes = mStaticInfo.getAvailableNoiseReductionModesChecked();
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         startPreview(requestBuilder, maxPrevSize, resultListener);
 
         for (int mode : availableModes) {
             requestBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE, mode);
-            resultListener = new SimpleCaptureListener();
+            resultListener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), resultListener, mHandler);
             waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -583,7 +583,7 @@
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
         requestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         startPreview(requestBuilder, maxPrevSize, resultListener);
 
         CaptureRequest request;
@@ -591,7 +591,7 @@
         for (int i = 0; i < testDistances.length; i++) {
             requestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, testDistances[i]);
             request = requestBuilder.build();
-            resultListener = new SimpleCaptureListener();
+            resultListener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(request, resultListener, mHandler);
             waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
             resultDistances[i] = verifyFocusDistanceControl(testDistances[i], request,
@@ -614,7 +614,7 @@
             if (hyperFocalDistance > 0) {
                 requestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, hyperFocalDistance);
                 request = requestBuilder.build();
-                resultListener = new SimpleCaptureListener();
+                resultListener = new SimpleCaptureCallback();
                 mSession.setRepeatingRequest(request, resultListener, mHandler);
                 waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -651,7 +651,7 @@
      * @return the result focus distance
      */
     private float verifyFocusDistanceControl(float distance, CaptureRequest request,
-            SimpleCaptureListener resultListener) {
+            SimpleCaptureCallback resultListener) {
         // Need make sure the result corresponding to the request is back, then check.
         CaptureResult result =
                 resultListener.getCaptureResultForRequest(request, NUM_RESULTS_WAIT_TIMEOUT);
@@ -682,12 +682,12 @@
         int[] edgeModes = mStaticInfo.getAvailableEdgeModesChecked();
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         startPreview(requestBuilder, maxPrevSize, resultListener);
 
         for (int mode : edgeModes) {
             requestBuilder.set(CaptureRequest.EDGE_MODE, mode);
-            resultListener = new SimpleCaptureListener();
+            resultListener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), resultListener, mHandler);
             waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -717,7 +717,7 @@
         updatePreviewSurface(maxPreviewSz);
         CaptureRequest.Builder manualRequestBuilder = createRequestForPreview();
         CaptureRequest.Builder previewRequestBuilder = createRequestForPreview();
-        SimpleCaptureListener listener = new SimpleCaptureListener();
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
 
         startPreview(previewRequestBuilder, maxPreviewSz, listener);
 
@@ -814,7 +814,7 @@
      * @param listener The Capture listener that is used to wait for capture result
      * @param aeMode The AE mode for flash to test with
      */
-    private void flashTestByAeMode(SimpleCaptureListener listener, int aeMode) throws Exception {
+    private void flashTestByAeMode(SimpleCaptureCallback listener, int aeMode) throws Exception {
         CaptureResult result;
         final int NUM_FLASH_REQUESTS_TESTED = 10;
         CaptureRequest.Builder requestBuilder = createRequestForPreview();
@@ -892,7 +892,7 @@
                 result.get(CaptureResult.FLASH_MODE));
     }
 
-    private void verifyAntiBandingMode(SimpleCaptureListener listener, int numFramesVerified,
+    private void verifyAntiBandingMode(SimpleCaptureCallback listener, int numFramesVerified,
             int mode, boolean isAeManual, long requestExpTime) throws Exception {
         // Skip the first a couple of frames as antibanding may not be fully up yet.
         final int NUM_FRAMES_SKIPPED = 5;
@@ -959,7 +959,7 @@
         requestBuilder.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, mode);
 
         // Test auto AE mode anti-banding behavior
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         startPreview(requestBuilder, size, resultListener);
         waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
         verifyAntiBandingMode(resultListener, NUM_FRAMES_VERIFIED, mode, /*isAeManual*/false,
@@ -970,7 +970,7 @@
         final long TEST_MANUAL_EXP_TIME_NS = 65000000L;
         long manualExpTime = mStaticInfo.getExposureClampToRange(TEST_MANUAL_EXP_TIME_NS);
         changeExposure(requestBuilder, manualExpTime);
-        resultListener = new SimpleCaptureListener();
+        resultListener = new SimpleCaptureCallback();
         startPreview(requestBuilder, size, resultListener);
         waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
         verifyAntiBandingMode(resultListener, NUM_FRAMES_VERIFIED, mode, /*isAeManual*/true,
@@ -1053,7 +1053,7 @@
         }
 
         final int NUM_CAPTURES_BEFORE_LOCK = 2;
-        SimpleCaptureListener listener =  new SimpleCaptureListener();
+        SimpleCaptureCallback listener =  new SimpleCaptureCallback();
 
         CaptureResult[] resultsDuringLock = new CaptureResult[numCapturesDuringLock];
 
@@ -1119,7 +1119,7 @@
 
         requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CONTROL_AE_MODE_OFF);
         configurePreviewOutput(requestBuilder);
-        SimpleCaptureListener listener =  new SimpleCaptureListener();
+        SimpleCaptureCallback listener =  new SimpleCaptureCallback();
 
         long[] expTimes = getExposureTimeTestValues();
         int[] sensitivities = getSensitivityTestValues();
@@ -1151,7 +1151,7 @@
     /**
      * Verify black level lock control.
      */
-    private void verifyBlackLevelLockResults(SimpleCaptureListener listener, int numFramesVerified,
+    private void verifyBlackLevelLockResults(SimpleCaptureCallback listener, int numFramesVerified,
             int maxLockOffCnt) throws Exception {
         int noLockCnt = 0;
         for (int i = 0; i < numFramesVerified; i++) {
@@ -1175,7 +1175,7 @@
     /**
      * Verify shading map for different shading modes.
      */
-    private void verifyShadingMap(SimpleCaptureListener listener, int numFramesVerified,
+    private void verifyShadingMap(SimpleCaptureCallback listener, int numFramesVerified,
             int shadingMode) throws Exception {
 
         for (int i = 0; i < numFramesVerified; i++) {
@@ -1225,7 +1225,7 @@
     private void faceDetectionTestByCamera() throws Exception {
         int[] faceDetectModes = mStaticInfo.getAvailableFaceDetectModesChecked();
 
-        SimpleCaptureListener listener;
+        SimpleCaptureCallback listener;
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
 
@@ -1238,7 +1238,7 @@
 
             // Create a new listener for each run to avoid the results from one run spill
             // into another run.
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             startPreview(requestBuilder, maxPreviewSz, listener);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
             verifyFaceDetectionResults(listener, NUM_FACE_DETECTION_FRAMES_VERIFIED, mode);
@@ -1254,7 +1254,7 @@
      * @param numFramesVerified Number of results to be verified
      * @param faceDetectionMode Face detection mode to be verified against
      */
-    private void verifyFaceDetectionResults(SimpleCaptureListener listener, int numFramesVerified,
+    private void verifyFaceDetectionResults(SimpleCaptureCallback listener, int numFramesVerified,
             int faceDetectionMode) {
         for (int i = 0; i < numFramesVerified; i++) {
             CaptureResult result = listener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
@@ -1337,7 +1337,7 @@
             return;
         }
 
-        SimpleCaptureListener listener;
+        SimpleCaptureCallback listener;
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
 
@@ -1356,7 +1356,7 @@
                 requestBuilder.set(CaptureRequest.TONEMAP_CURVE, tcLinear);
                 // Create a new listener for each run to avoid the results from one run spill
                 // into another run.
-                listener = new SimpleCaptureListener();
+                listener = new SimpleCaptureCallback();
                 startPreview(requestBuilder, maxPreviewSz, listener);
                 waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
@@ -1367,7 +1367,7 @@
                 requestBuilder.set(CaptureRequest.TONEMAP_CURVE, tcSrgb);
                 // Create a new listener for each run to avoid the results from one run spill
                 // into another run.
-                listener = new SimpleCaptureListener();
+                listener = new SimpleCaptureCallback();
                 startPreview(requestBuilder, maxPreviewSz, listener);
                 waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
@@ -1375,7 +1375,7 @@
             } else {
                 // Create a new listener for each run to avoid the results from one run spill
                 // into another run.
-                listener = new SimpleCaptureListener();
+                listener = new SimpleCaptureCallback();
                 startPreview(requestBuilder, maxPreviewSz, listener);
                 waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
                 verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
@@ -1398,7 +1398,7 @@
      * @param inputToneCurve Tonemap curve used by all 3 channels, ignored when
      * map mode is not CONTRAST_CURVE.
      */
-    private void verifyToneMapModeResults(SimpleCaptureListener listener, int numFramesVerified,
+    private void verifyToneMapModeResults(SimpleCaptureCallback listener, int numFramesVerified,
             int tonemapMode, float[] inputToneCurve) {
         final int MIN_TONEMAP_CURVE_POINTS = 2;
         final Float ZERO = new Float(0);
@@ -1459,9 +1459,9 @@
         startPreview(requestBuilder, maxPreviewSize, /*listener*/null);
 
         for (int mode : awbModes) {
-            SimpleCaptureListener listener;
+            SimpleCaptureCallback listener;
             requestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, mode);
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -1471,7 +1471,7 @@
 
             // Verify color correction transform and gains stay unchanged after a lock.
             requestBuilder.set(CaptureRequest.CONTROL_AWB_LOCK, true);
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -1484,7 +1484,7 @@
         }
     }
 
-    private void verifyAwbCaptureResultUnchanged(SimpleCaptureListener listener,
+    private void verifyAwbCaptureResultUnchanged(SimpleCaptureCallback listener,
             int numFramesVerified) {
         // Skip check if cc gains/transform/mode are not available
         if (!mStaticInfo.areKeysAvailable(
@@ -1532,9 +1532,9 @@
         startPreview(requestBuilder, maxPreviewSize, /*listener*/null);
 
         for (int mode : afModes) {
-            SimpleCaptureListener listener;
+            SimpleCaptureCallback listener;
             requestBuilder.set(CaptureRequest.CONTROL_AF_MODE, mode);
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -1571,11 +1571,11 @@
         Size maxPreviewSize = mOrderedPreviewSizes.get(0);
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        SimpleCaptureListener listener = new SimpleCaptureListener();
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
         startPreview(requestBuilder, maxPreviewSize, listener);
 
         for (int mode : videoStabModes) {
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             requestBuilder.set(CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE, mode);
             mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
@@ -1584,7 +1584,7 @@
         }
 
         for (int mode : opticalStabModes) {
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             requestBuilder.set(CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE, mode);
             mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
@@ -1630,7 +1630,7 @@
         MeteringRectangle[][] expectRegions = new MeteringRectangle[ZOOM_STEPS][];
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        SimpleCaptureListener listener = new SimpleCaptureListener();
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
 
         updatePreviewSurface(previewSize);
         configurePreviewOutput(requestBuilder);
@@ -1793,13 +1793,13 @@
         Size maxPreviewSize = mOrderedPreviewSizes.get(0);
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        SimpleCaptureListener listener = new SimpleCaptureListener();
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
         requestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_USE_SCENE_MODE);
         startPreview(requestBuilder, maxPreviewSize, listener);
 
         for(int mode : sceneModes) {
             requestBuilder.set(CaptureRequest.CONTROL_SCENE_MODE, mode);
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -1817,12 +1817,12 @@
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
         requestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
-        SimpleCaptureListener listener = new SimpleCaptureListener();
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
         startPreview(requestBuilder, maxPreviewSize, listener);
 
         for(int mode : effectModes) {
             requestBuilder.set(CaptureRequest.CONTROL_EFFECT_MODE, mode);
-            listener = new SimpleCaptureListener();
+            listener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
             waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
 
@@ -1999,7 +1999,7 @@
      * @param numFramesVerified The number of capture results to be verified
      */
     private <T> void verifyCaptureResultForKey(CaptureResult.Key<T> key, T requestMode,
-            SimpleCaptureListener listener, int numFramesVerified) {
+            SimpleCaptureCallback listener, int numFramesVerified) {
         for (int i = 0; i < numFramesVerified; i++) {
             CaptureResult result = listener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
             validatePipelineDepth(result);
@@ -2035,7 +2035,7 @@
         Range<Integer>[] fpsRanges = mStaticInfo.getAeAvailableTargetFpsRangesChecked();
         boolean antiBandingOffIsSupported = mStaticInfo.isAntiBandingOffModeSupported();
         Range<Integer> fpsRange;
-        SimpleCaptureListener resultListener;
+        SimpleCaptureCallback resultListener;
 
         for (int i = 0; i < fpsRanges.length; i += 1) {
             fpsRange = fpsRanges[i];
@@ -2065,7 +2065,7 @@
                         " mode");
             }
 
-            resultListener = new SimpleCaptureListener();
+            resultListener = new SimpleCaptureCallback();
             startPreview(requestBuilder, previewSz, resultListener);
             long[] frameDurationRange =
                     new long[]{(long) (1e9 / fpsRange.getUpper()), (long) (1e9 / fpsRange.getLower())};
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
index ba4fce0..483587e 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
@@ -113,7 +113,7 @@
                 requestBuilder.addTarget(mReaderSurface);
 
                 // Start capture
-                SimpleCaptureListener captureListener = new SimpleCaptureListener();
+                SimpleCaptureCallback captureListener = new SimpleCaptureCallback();
                 startCapture(requestBuilder.build(), /*repeating*/true, captureListener, mHandler);
 
                 // Get the waived keys for current camera device
@@ -293,10 +293,10 @@
                 multiBuilder.addTarget(previewReader.getSurface());
                 multiBuilder.addTarget(jpegReader.getSurface());
 
-                CaptureListener mockCaptureListener = getMockCaptureListener();
+                CaptureCallback mockCaptureCallback = getMockCaptureListener();
 
                 // Capture targeting only preview
-                Pair<TotalCaptureResult, Long> result = captureAndVerifyResult(mockCaptureListener,
+                Pair<TotalCaptureResult, Long> result = captureAndVerifyResult(mockCaptureCallback,
                         session, previewBuilder.build(), mHandler);
 
                 // Check if all timestamps are the same
@@ -304,7 +304,7 @@
                         prevListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS), result.second);
 
                 // Capture targeting both jpeg and preview
-                Pair<TotalCaptureResult, Long> result2 = captureAndVerifyResult(mockCaptureListener,
+                Pair<TotalCaptureResult, Long> result2 = captureAndVerifyResult(mockCaptureCallback,
                         session, multiBuilder.build(), mHandler);
 
                 // Check if all timestamps are the same
@@ -319,9 +319,9 @@
 
                 // Capture two preview frames
                 long startTime = SystemClock.elapsedRealtimeNanos();
-                Pair<TotalCaptureResult, Long> result3 = captureAndVerifyResult(mockCaptureListener,
+                Pair<TotalCaptureResult, Long> result3 = captureAndVerifyResult(mockCaptureCallback,
                         session, previewBuilder.build(), mHandler);
-                Pair<TotalCaptureResult, Long> result4 = captureAndVerifyResult(mockCaptureListener,
+                Pair<TotalCaptureResult, Long> result4 = captureAndVerifyResult(mockCaptureCallback,
                         session, previewBuilder.build(), mHandler);
                 long clockDiff = SystemClock.elapsedRealtimeNanos() - startTime;
                 long resultDiff = result4.second - result3.second;
@@ -352,7 +352,7 @@
                 resultImage.getTimestamp(), captureTime);
     }
 
-    private void validateCaptureResult(SimpleCaptureListener captureListener,
+    private void validateCaptureResult(SimpleCaptureCallback captureListener,
             List<CaptureResult.Key<?>> skippedKeys, CaptureRequest.Builder requestBuilder,
             int numFramesVerified) throws Exception {
         CaptureResult result = null;
@@ -524,7 +524,7 @@
      * with multiple handlers.</p>
      * */
     private static class TotalAndPartialResultListener
-            extends CameraCaptureSession.CaptureListener {
+            extends CameraCaptureSession.CaptureCallback {
         static final int ERROR_DUPLICATED_REQUEST = 1 << 0;
         static final int ERROR_WRONG_CALLBACK_ORDER = 1 << 1;
 
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java
index 1173eab..29c3526 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java
@@ -290,8 +290,8 @@
         CaptureRequest.Builder request = prepareCaptureRequestForSurfaces(outputSurfaces);
         request.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE,
                 CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON);
-        CameraTestUtils.SimpleCaptureListener resultListener =
-                new CameraTestUtils.SimpleCaptureListener();
+        CameraTestUtils.SimpleCaptureCallback resultListener =
+                new CameraTestUtils.SimpleCaptureCallback();
 
         startCapture(request.build(), /*repeating*/false, resultListener, mHandler);
 
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
index a44b255..7d2341a 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
@@ -218,7 +218,7 @@
                 outputSurfaces.add(yuvSurface);
                 outputSurfaces.add(captureSurface);
                 CaptureRequest.Builder request = prepareCaptureRequestForSurfaces(outputSurfaces);
-                SimpleCaptureListener resultListener = new SimpleCaptureListener();
+                SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
 
                 for (int i = 0; i < NUM_SINGLE_CAPTURE_TESTED; i++) {
                     startCapture(request.build(), /*repeating*/false, resultListener, mHandler);
@@ -278,7 +278,7 @@
 
                 // Start capture.
                 CaptureRequest request = prepareCaptureRequest();
-                SimpleCaptureListener listener = new SimpleCaptureListener();
+                SimpleCaptureCallback listener = new SimpleCaptureCallback();
                 startCapture(request, repeating, listener, mHandler);
 
                 int numFrameVerified = repeating ? NUM_FRAME_VERIFIED : 1;
@@ -305,7 +305,7 @@
      * @param size The capture size.
      * @param listener The capture listener to get capture result callbacks.
      */
-    private void validateCaptureResult(int format, Size size, SimpleCaptureListener listener,
+    private void validateCaptureResult(int format, Size size, SimpleCaptureCallback listener,
             int numFrameVerified) {
         for (int i = 0; i < numFrameVerified; i++) {
             CaptureResult result = listener.getCaptureResult(CAPTURE_RESULT_TIMEOUT_MS);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
index 72e18bb..1033ecd 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
@@ -126,7 +126,7 @@
             // The only error accepted is ERROR_MAX_CAMERAS_IN_USE, which means HAL doesn't support
             // concurrent camera streaming
             assertEquals("Camera device open failed",
-                    CameraDevice.StateListener.ERROR_MAX_CAMERAS_IN_USE, e.getCode());
+                    CameraDevice.StateCallback.ERROR_MAX_CAMERAS_IN_USE, e.getCode());
             Log.i(TAG, "Camera HAL does not support dual camera preview. Skip the test");
         } finally {
             for (int i = 0; i < NUM_CAMERAS_TESTED; i++) {
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
index 761a5a3..aeab4cf 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
@@ -16,11 +16,11 @@
 
 package android.hardware.camera2.cts;
 
-import static com.android.ex.camera2.blocking.BlockingSessionListener.*;
+import static com.android.ex.camera2.blocking.BlockingSessionCallback.*;
 
 import android.graphics.ImageFormat;
 import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
@@ -43,7 +43,7 @@
 import com.android.cts.util.ResultType;
 import com.android.cts.util.ResultUnit;
 import com.android.cts.util.Stat;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
 import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
 
 import java.util.ArrayList;
@@ -121,8 +121,8 @@
                         configureStreamTimes[i] = configureTimeMs - openTimeMs;
 
                         // Blocking start preview (start preview to first image arrives)
-                        CameraTestUtils.SimpleCaptureListener resultListener =
-                                new CameraTestUtils.SimpleCaptureListener();
+                        CameraTestUtils.SimpleCaptureCallback resultListener =
+                                new CameraTestUtils.SimpleCaptureCallback();
                         blockingStartPreview(resultListener, imageListener);
                         previewStartedTimeMs = SystemClock.elapsedRealtime();
                         startPreviewTimes[i] = previewStartedTimeMs - configureTimeMs;
@@ -203,8 +203,8 @@
                             mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                     CaptureRequest.Builder captureBuilder =
                             mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
-                    CameraTestUtils.SimpleCaptureListener previewResultListener =
-                            new CameraTestUtils.SimpleCaptureListener();
+                    CameraTestUtils.SimpleCaptureCallback previewResultListener =
+                            new CameraTestUtils.SimpleCaptureCallback();
                     SimpleTimingResultListener captureResultListener =
                             new SimpleTimingResultListener();
                     SimpleImageListener imageListener = new SimpleImageListener();
@@ -267,7 +267,7 @@
                 CameraTestUtils.SESSION_CLOSE_TIMEOUT_MS);
     }
 
-    private void blockingStartPreview(CaptureListener listener, SimpleImageListener imageListener)
+    private void blockingStartPreview(CaptureCallback listener, SimpleImageListener imageListener)
             throws Exception {
         if (mPreviewSurface == null || mReaderSurface == null) {
             throw new IllegalStateException("preview and reader surface must be initilized first");
@@ -281,7 +281,7 @@
         imageListener.waitForImageAvailable(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
     }
 
-    private void blockingCaptureImage(CaptureListener listener,
+    private void blockingCaptureImage(CaptureCallback listener,
             SimpleImageListener imageListener) throws Exception {
         if (mReaderSurface == null) {
             throw new IllegalStateException("reader surface must be initialized first");
@@ -301,7 +301,7 @@
         if (mPreviewSurface == null || mReaderSurface == null) {
             throw new IllegalStateException("preview and reader surface must be initilized first");
         }
-        mSessionListener = new BlockingSessionListener();
+        mSessionListener = new BlockingSessionCallback();
         List<Surface> outputSurfaces = new ArrayList<>();
         outputSurfaces.add(mPreviewSurface);
         outputSurfaces.add(mReaderSurface);
@@ -383,7 +383,7 @@
     }
 
     private static class SimpleTimingResultListener
-            extends CameraCaptureSession.CaptureListener {
+            extends CameraCaptureSession.CaptureCallback {
         private final LinkedBlockingQueue<Pair<CaptureResult, Long> > mPartialResultQueue =
                 new LinkedBlockingQueue<Pair<CaptureResult, Long> >();
         private final LinkedBlockingQueue<Pair<CaptureResult, Long> > mResultQueue =
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
index f402da5..83c3afb 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
@@ -12,7 +12,7 @@
 package android.hardware.camera2.cts;
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingSessionListener.*;
+import static com.android.ex.camera2.blocking.BlockingSessionCallback.*;
 
 import android.graphics.ImageFormat;
 import android.hardware.camera2.CameraCharacteristics;
@@ -39,7 +39,7 @@
 import android.util.Range;
 import android.view.Surface;
 
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
 
 import junit.framework.AssertionFailedError;
 
@@ -337,7 +337,7 @@
         if (mReaderSurface != null) {
             outputSurfaces.add(mReaderSurface);
         }
-        mSessionListener = new BlockingSessionListener();
+        mSessionListener = new BlockingSessionCallback();
         mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
 
         CaptureRequest.Builder recordingRequestBuilder =
@@ -581,7 +581,7 @@
             prepareRecordingWithProfile(profile);
 
             // prepare video snapshot
-            SimpleCaptureListener resultListener = new SimpleCaptureListener();
+            SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
             SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
             CaptureRequest.Builder videoSnapshotRequestBuilder =
                     mCamera.createCaptureRequest(CameraDevice.TEMPLATE_VIDEO_SNAPSHOT);
@@ -726,7 +726,7 @@
     }
 
     private void startRecording(boolean useMediaRecorder,
-            CameraCaptureSession.CaptureListener listener) throws Exception {
+            CameraCaptureSession.CaptureCallback listener) throws Exception {
         List<Surface> outputSurfaces = new ArrayList<Surface>(2);
         assertTrue("Both preview and recording surfaces should be valid",
                 mPreviewSurface.isValid() && mRecordingSurface.isValid());
@@ -736,7 +736,7 @@
         if (mReaderSurface != null) {
             outputSurfaces.add(mReaderSurface);
         }
-        mSessionListener = new BlockingSessionListener();
+        mSessionListener = new BlockingSessionCallback();
         mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
 
         CaptureRequest.Builder recordingRequestBuilder =
@@ -841,7 +841,7 @@
      * Here frame drop is defined as frame duration >= 2 * expected frame duration.
      */
     private void validateFrameDropAroundVideoSnapshot(
-            SimpleCaptureListener resultListener, long imageTimeStamp) {
+            SimpleCaptureCallback resultListener, long imageTimeStamp) {
         int expectedDurationMs = 1000 / mVideoFrameRate;
         CaptureResult prevResult = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
         long prevTS = getValueNotNull(prevResult, CaptureResult.SENSOR_TIMESTAMP);
@@ -890,7 +890,7 @@
     /**
      * Validate frame jittering from the input simple listener's buffered results
      */
-    private void validateJittering(SimpleCaptureListener resultListener) {
+    private void validateJittering(SimpleCaptureCallback resultListener) {
         int expectedDurationMs = 1000 / mVideoFrameRate;
         CaptureResult prevResult = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
         long prevTS = getValueNotNull(prevResult, CaptureResult.SENSOR_TIMESTAMP);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
index bdbe44f..5b0f0fd 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
@@ -25,7 +25,7 @@
 import android.util.Log;
 import android.view.Surface;
 
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -60,12 +60,12 @@
                 CaptureRequest.Builder request =
                         mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                 request.addTarget(surface);
-                CameraCaptureSession.CaptureListener mockCaptureListener =
-                        mock(CameraCaptureSession.CaptureListener.class);
+                CameraCaptureSession.CaptureCallback mockCaptureListener =
+                        mock(CameraCaptureSession.CaptureCallback.class);
 
                 // Check that correct session callback is hit.
-                CameraCaptureSession.StateListener sessionListener =
-                        mock(CameraCaptureSession.StateListener.class);
+                CameraCaptureSession.StateCallback sessionListener =
+                        mock(CameraCaptureSession.StateCallback.class);
                 mCamera.createCaptureSession(surfaces, sessionListener, mHandler);
                 verify(sessionListener, timeout(FAILED_CONFIGURE_TIMEOUT).atLeastOnce()).
                         onConfigureFailed(any(CameraCaptureSession.class));
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
index 5c6328d..2e03e43 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
@@ -32,7 +32,7 @@
 import android.media.ImageReader;
 import android.util.Pair;
 import android.util.Size;
-import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureListener;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
 import android.hardware.camera2.cts.CameraTestUtils.SimpleImageReaderListener;
 import android.hardware.camera2.cts.helpers.Camera2Focuser;
 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
@@ -46,7 +46,7 @@
 import android.util.Rational;
 import android.view.Surface;
 
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
 import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
 
 import java.io.ByteArrayOutputStream;
@@ -391,8 +391,8 @@
         Size maxStillSz = mOrderedStillSizes.get(0);
         Size maxPreviewSz = mOrderedPreviewSizes.get(0);
 
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
-        SimpleCaptureListener stillResultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
+        SimpleCaptureCallback stillResultListener = new SimpleCaptureCallback();
         SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
         CaptureRequest.Builder previewRequest =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
@@ -443,7 +443,7 @@
         Size maxStillSz = mOrderedStillSizes.get(0);
         Size maxPreviewSz = mOrderedPreviewSizes.get(0);
         CaptureResult result;
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
         CaptureRequest.Builder previewRequest =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
@@ -496,7 +496,7 @@
         /**
          * Step 2: AF is already locked, wait for AWB converged, then lock it.
          */
-        resultListener = new SimpleCaptureListener();
+        resultListener = new SimpleCaptureCallback();
         boolean canSetAwbRegion =
                 (awbRegions != null) && isRegionsSupportedFor3A(MAX_REGIONS_AWB_INDEX);
         if (canSetAwbRegion) {
@@ -528,7 +528,7 @@
         /**
          * Step 3: trigger an AE precapture metering sequence and wait for AE converged.
          */
-        resultListener = new SimpleCaptureListener();
+        resultListener = new SimpleCaptureCallback();
         boolean canSetAeRegion =
                 (aeRegions != null) && isRegionsSupportedFor3A(MAX_REGIONS_AE_INDEX);
         if (canSetAeRegion) {
@@ -560,7 +560,7 @@
         /**
          * Step 4: take a picture when all 3A are in good state.
          */
-        resultListener = new SimpleCaptureListener();
+        resultListener = new SimpleCaptureCallback();
         CaptureRequest request = stillRequest.build();
         mSession.capture(request, resultListener, mHandler);
         // Validate the next result immediately for region and mode.
@@ -591,7 +591,7 @@
      * Test touch region for focus by camera.
      */
     private void touchForFocusTestByCamera() throws Exception {
-        SimpleCaptureListener listener = new SimpleCaptureListener();
+        SimpleCaptureCallback listener = new SimpleCaptureCallback();
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
         Size maxPreviewSz = mOrderedPreviewSizes.get(0);
@@ -610,7 +610,7 @@
     }
 
     private void previewStillCombinationTestByCamera() throws Exception {
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
 
         for (Size stillSz : mOrderedStillSizes)
@@ -652,7 +652,7 @@
                     mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
             CaptureRequest.Builder rawBuilder =
                     mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
-            SimpleCaptureListener resultListener = new SimpleCaptureListener();
+            SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
             SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
             prepareRawCaptureAndStartPreview(previewBuilder, rawBuilder, maxPreviewSz, size,
                     resultListener, imageListener);
@@ -693,7 +693,7 @@
             CaptureRequest.Builder multiBuilder =
                     mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
 
-            SimpleCaptureListener resultListener = new SimpleCaptureListener();
+            SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
             SimpleImageReaderListener jpegListener = new SimpleImageReaderListener();
             SimpleImageReaderListener rawListener = new SimpleImageReaderListener();
 
@@ -714,7 +714,7 @@
                 outputSurfaces.add(rawReader.getSurface());
                 outputSurfaces.add(jpegReader.getSurface());
                 outputSurfaces.add(mPreviewSurface);
-                mSessionListener = new BlockingSessionListener();
+                mSessionListener = new BlockingSessionCallback();
                 mSession = configureCameraSession(mCamera, outputSurfaces,
                         mSessionListener, mHandler);
 
@@ -892,7 +892,7 @@
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
         CaptureRequest.Builder stillBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
         prepareStillCaptureAndStartPreview(previewBuilder, stillBuilder, maxPreviewSz, maxStillSz,
                 resultListener, imageListener);
@@ -1214,7 +1214,7 @@
 
         Size maxStillSz = mOrderedStillSizes.get(0);
         Size maxPreviewSz = mOrderedPreviewSizes.get(0);
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
         CaptureRequest.Builder previewRequest =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java
index 6dd7c1e..aad9c2f 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java
@@ -19,14 +19,14 @@
 import static android.hardware.camera2.cts.CameraTestUtils.*;
 
 import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CaptureFailure;
 import android.hardware.camera2.CaptureRequest;
 import android.hardware.camera2.CaptureResult;
 import android.hardware.camera2.TotalCaptureResult;
 import android.util.Size;
-import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureListener;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
 import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
 import android.util.Log;
 import android.util.Range;
@@ -64,7 +64,7 @@
      * Test all supported preview sizes for each camera device.
      * <p>
      * For the first  {@link #NUM_FRAMES_VERIFIED}  of capture results,
-     * the {@link CaptureListener} callback availability and the capture timestamp
+     * the {@link CaptureCallback} callback availability and the capture timestamp
      * (monotonically increasing) ordering are verified.
      * </p>
      */
@@ -129,7 +129,7 @@
         Range<Integer> fpsRange;
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        SimpleCaptureListener resultListener = new SimpleCaptureListener();
+        SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
         startPreview(requestBuilder, maxPreviewSz, resultListener);
 
         for (int i = 0; i < fpsRanges.length; i += 1) {
@@ -149,7 +149,7 @@
                         " mode");
             }
 
-            resultListener = new SimpleCaptureListener();
+            resultListener = new SimpleCaptureCallback();
             mSession.setRepeatingRequest(requestBuilder.build(), resultListener, mHandler);
 
             verifyPreviewTargetFpsRange(resultListener, NUM_FRAMES_VERIFIED, fpsRange,
@@ -159,7 +159,7 @@
         stopPreview();
     }
 
-    private void verifyPreviewTargetFpsRange(SimpleCaptureListener resultListener,
+    private void verifyPreviewTargetFpsRange(SimpleCaptureCallback resultListener,
             int numFramesVerified, Range<Integer> fpsRange, Size previewSz) {
         CaptureResult result = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
         List<Integer> capabilities = mStaticInfo.getAvailableCapabilitiesChecked();
@@ -206,11 +206,11 @@
             // TODO: vary the different settings like crop region to cover more cases.
             CaptureRequest.Builder requestBuilder =
                     mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-            CaptureListener mockCaptureListener =
-                    mock(CameraCaptureSession.CaptureListener.class);
+            CaptureCallback mockCaptureCallback =
+                    mock(CameraCaptureSession.CaptureCallback.class);
 
-            startPreview(requestBuilder, sz, mockCaptureListener);
-            verifyCaptureResults(mSession, mockCaptureListener, NUM_FRAMES_VERIFIED,
+            startPreview(requestBuilder, sz, mockCaptureCallback);
+            verifyCaptureResults(mSession, mockCaptureCallback, NUM_FRAMES_VERIFIED,
                     NUM_FRAMES_VERIFIED * FRAME_TIMEOUT_MS);
             stopPreview();
         }
@@ -221,7 +221,7 @@
         int[] testPatternModes = mStaticInfo.getAvailableTestPatternModesChecked();
         CaptureRequest.Builder requestBuilder =
                 mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
-        CaptureListener mockCaptureListener;
+        CaptureCallback mockCaptureCallback;
 
         final int[] TEST_PATTERN_DATA = {0, 0xFFFFFFFF, 0xFFFFFFFF, 0}; // G:100%, RB:0.
         for (int mode : testPatternModes) {
@@ -233,9 +233,9 @@
                 // Assign color pattern to SENSOR_TEST_PATTERN_MODE_DATA
                 requestBuilder.set(CaptureRequest.SENSOR_TEST_PATTERN_DATA, TEST_PATTERN_DATA);
             }
-            mockCaptureListener = mock(CaptureListener.class);
-            startPreview(requestBuilder, maxPreviewSize, mockCaptureListener);
-            verifyCaptureResults(mSession, mockCaptureListener, NUM_TEST_PATTERN_FRAMES_VERIFIED,
+            mockCaptureCallback = mock(CaptureCallback.class);
+            startPreview(requestBuilder, maxPreviewSize, mockCaptureCallback);
+            verifyCaptureResults(mSession, mockCaptureCallback, NUM_TEST_PATTERN_FRAMES_VERIFIED,
                     NUM_TEST_PATTERN_FRAMES_VERIFIED * FRAME_TIMEOUT_MS);
         }
 
@@ -256,7 +256,7 @@
 
     private void verifyCaptureResults(
             CameraCaptureSession session,
-            CaptureListener mockListener,
+            CaptureCallback mockListener,
             int expectResultCount,
             int timeOutMs) {
         // Should receive expected number of onCaptureStarted callbacks.
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/Camera2Focuser.java b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/Camera2Focuser.java
index c03cacab9..1c42629 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/Camera2Focuser.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/Camera2Focuser.java
@@ -19,7 +19,7 @@
 import android.graphics.Rect;
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraCharacteristics;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.params.MeteringRectangle;
@@ -215,7 +215,7 @@
         CaptureRequest.Builder requestBuilder = createRequestBuilder();
         mAutoFocus.setPassiveAutoFocus(/*picture*/true, mRepeatingBuilder);
         mAutoFocus.unlockAutoFocus(mRepeatingBuilder, requestBuilder);
-        CaptureListener listener = createCaptureListener();
+        CaptureCallback listener = createCaptureListener();
         mSession.setRepeatingRequest(mRepeatingBuilder.build(), listener, mHandler);
         mSession.capture(requestBuilder.build(), listener, mHandler);
     }
@@ -252,7 +252,7 @@
                 return;
             } else if (mSuccess) {
                 mAutoFocus.lockAutoFocus(mRepeatingBuilder, requestBuilder);
-                CaptureListener listener = createCaptureListener();
+                CaptureCallback listener = createCaptureListener();
                 mSession.setRepeatingRequest(mRepeatingBuilder.build(), listener, mHandler);
                 mSession.capture(requestBuilder.build(), listener, mHandler);
             } else {
@@ -276,7 +276,7 @@
         }
         mAutoFocus.resetState();
 
-        CaptureListener listener = createCaptureListener();
+        CaptureCallback listener = createCaptureListener();
         mSession.setRepeatingRequest(mRepeatingBuilder.build(), listener, mHandler);
         mSession.capture(requestBuilder.build(), listener, mHandler);
     }
@@ -332,7 +332,7 @@
         mAfRegions = new MeteringRectangle[] {
                 new MeteringRectangle(0, 0, 0, 0, MeteringRectangle.METERING_WEIGHT_DONT_CARE)};
     }
-    private CaptureListener createCaptureListener() {
+    private CaptureCallback createCaptureListener() {
 
         int thisAfRun;
         synchronized (this) {
@@ -341,7 +341,7 @@
 
         final int finalAfRun = thisAfRun;
 
-        return new CaptureListener() {
+        return new CaptureCallback() {
             private long mLatestFrameCount = -1;
 
             @Override
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraSessionUtils.java b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraSessionUtils.java
index 134d674..140a645 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraSessionUtils.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraSessionUtils.java
@@ -27,8 +27,8 @@
 import android.util.Pair;
 import android.view.Surface;
 
-import com.android.ex.camera2.blocking.BlockingCaptureListener;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingCaptureCallback;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
 import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
 
 import junit.framework.Assert;
@@ -51,7 +51,7 @@
     /**
      * A blocking listener class for synchronously opening and configuring sessions.
      */
-    public static class SessionListener extends BlockingSessionListener {
+    public static class SessionListener extends BlockingSessionCallback {
         private final LinkedBlockingQueue<CameraCaptureSession> mSessionQueue =
                 new LinkedBlockingQueue<>();
 
@@ -91,7 +91,7 @@
     /**
      * A blocking listener class for synchronously capturing and results with a session.
      */
-    public static class CaptureListener extends BlockingCaptureListener {
+    public static class CaptureCallback extends BlockingCaptureCallback {
         private final LinkedBlockingQueue<TotalCaptureResult> mResultQueue =
                 new LinkedBlockingQueue<>();
         private final LinkedBlockingQueue<Long> mCaptureTimeQueue =
@@ -138,14 +138,14 @@
     }
 
     /**
-     * Get a mocked {@link CaptureListener}.
+     * Get a mocked {@link CaptureCallback}.
      */
-    public static CaptureListener getMockCaptureListener() {
-        return spy(new CaptureListener());
+    public static CaptureCallback getMockCaptureListener() {
+        return spy(new CaptureCallback());
     }
 
     /**
-     * Get a mocked {@link CaptureListener}.
+     * Get a mocked {@link CaptureCallback}.
      */
     public static SessionListener getMockSessionListener() {
         return spy(new SessionListener());
@@ -200,7 +200,7 @@
      * {@link CameraTestUtils#CAPTURE_RESULT_TIMEOUT_MS}.
      * </p>
      *
-     * @param listener a {@link CaptureListener} to use for callbacks.
+     * @param listener a {@link CaptureCallback} to use for callbacks.
      * @param session the {@link CameraCaptureSession} to use.
      * @param request the {@link CaptureRequest} to capture with.
      * @param handler the {@link Handler} to call callbacks on.
@@ -209,7 +209,7 @@
      * @throws CameraAccessException if any of the {@link CameraDevice} methods fail.
      * @throws TimeoutRuntimeException if no result was received before the timeout.
      */
-    public static Pair<TotalCaptureResult, Long> captureAndVerifyResult(CaptureListener listener,
+    public static Pair<TotalCaptureResult, Long> captureAndVerifyResult(CaptureCallback listener,
             CameraCaptureSession session, CaptureRequest request, Handler handler)
             throws CameraAccessException {
         checkNotNull(listener);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
index ed75d6c..5fc6321 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
@@ -17,11 +17,11 @@
 package android.hardware.camera2.cts.testcases;
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
 
 import android.content.Context;
 import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CameraManager;
 import android.hardware.camera2.CaptureRequest;
@@ -39,8 +39,8 @@
 import android.util.Log;
 import android.view.Surface;
 
-import com.android.ex.camera2.blocking.BlockingSessionListener;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
 
 import java.util.List;
 
@@ -57,8 +57,8 @@
     protected CameraManager mCameraManager;
     protected CameraDevice mCamera;
     protected CameraCaptureSession mCameraSession;
-    protected BlockingSessionListener mCameraSessionListener;
-    protected BlockingStateListener mCameraListener;
+    protected BlockingSessionCallback mCameraSessionListener;
+    protected BlockingStateCallback mCameraListener;
     protected String[] mCameraIds;
     protected ImageReader mReader;
     protected Surface mReaderSurface;
@@ -79,7 +79,7 @@
 
     /**
      * Set up the camera2 test case required environments, including CameraManager,
-     * HandlerThread, Camera IDs, and CameraStateListener etc.
+     * HandlerThread, Camera IDs, and CameraStateCallback etc.
      */
     @Override
     protected void setUp() throws Exception {
@@ -98,7 +98,7 @@
         mHandlerThread = new HandlerThread(TAG);
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
-        mCameraListener = new BlockingStateListener();
+        mCameraListener = new BlockingStateCallback();
         mCollector = new CameraErrorCollector();
     }
 
@@ -123,11 +123,11 @@
      *
      * @param request The {@link #CaptureRequest} to be captured.
      * @param repeating If the capture is single capture or repeating.
-     * @param listener The {@link #CaptureListener} camera device used to notify callbacks.
+     * @param listener The {@link #CaptureCallback} camera device used to notify callbacks.
      * @param handler The handler camera device used to post callbacks.
      */
     protected void startCapture(CaptureRequest request, boolean repeating,
-            CaptureListener listener, Handler handler) throws Exception {
+            CaptureCallback listener, Handler handler) throws Exception {
         if (VERBOSE) Log.v(TAG, "Starting capture from device");
 
         if (repeating) {
@@ -153,11 +153,11 @@
              */
             mCameraSession.abortCaptures();
             mCameraSessionListener.getStateWaiter().
-                    waitForState(BlockingSessionListener.SESSION_READY, CAMERA_IDLE_TIMEOUT_MS);
+                    waitForState(BlockingSessionCallback.SESSION_READY, CAMERA_IDLE_TIMEOUT_MS);
         } else {
             mCameraSession.close();
             mCameraSessionListener.getStateWaiter().
-                    waitForState(BlockingSessionListener.SESSION_CLOSED, CAMERA_IDLE_TIMEOUT_MS);
+                    waitForState(BlockingSessionCallback.SESSION_CLOSED, CAMERA_IDLE_TIMEOUT_MS);
         }
     }
 
@@ -175,9 +175,9 @@
      * Open a {@link #CameraDevice} and get the StaticMetadata for a given camera id and listener.
      *
      * @param cameraId The id of the camera device to be opened.
-     * @param listener The {@link #BlockingStateListener} used to wait for states.
+     * @param listener The {@link #BlockingStateCallback} used to wait for states.
      */
-    protected void openDevice(String cameraId, BlockingStateListener listener) throws Exception {
+    protected void openDevice(String cameraId, BlockingStateCallback listener) throws Exception {
         mCamera = CameraTestUtils.openCamera(
                 mCameraManager, cameraId, listener, mHandler);
         mCollector.setCameraId(cameraId);
@@ -199,7 +199,7 @@
      * @param outputSurfaces The set of output surfaces to configure for this session
      */
     protected void createSession(List<Surface> outputSurfaces) throws Exception {
-        mCameraSessionListener = new BlockingSessionListener();
+        mCameraSessionListener = new BlockingSessionCallback();
         mCameraSession = CameraTestUtils.configureCameraSession(mCamera, outputSurfaces,
                 mCameraSessionListener, mHandler);
     }
@@ -227,9 +227,9 @@
      * </p>
      *
      * @param cameraId The id of the camera device to be closed.
-     * @param listener The BlockingStateListener used to wait for states.
+     * @param listener The BlockingStateCallback used to wait for states.
      */
-    protected void closeDevice(String cameraId, BlockingStateListener listener) {
+    protected void closeDevice(String cameraId, BlockingStateCallback listener) {
         if (mCamera != null) {
             if (!cameraId.equals(mCamera.getId())) {
                 throw new IllegalStateException("Try to close a device that is not opened yet");
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java
index f7d743e..ce0bd7b 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java
@@ -17,8 +17,8 @@
 package android.hardware.camera2.cts.testcases;
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingSessionListener.*;
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static com.android.ex.camera2.blocking.BlockingSessionCallback.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
 
 import android.content.Context;
 import android.content.res.Configuration;
@@ -26,7 +26,7 @@
 import android.graphics.RectF;
 import android.graphics.SurfaceTexture;
 import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CameraManager;
 import android.hardware.camera2.CaptureRequest;
@@ -45,8 +45,8 @@
 import android.view.TextureView;
 
 import com.android.ex.camera2.blocking.BlockingCameraManager;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
 
 import junit.framework.Assert;
 
@@ -71,7 +71,7 @@
     protected Handler mHandler;
 
     private CameraManager mCameraManager;
-    private BlockingStateListener mCameraListener;
+    private BlockingStateCallback mCameraListener;
     private HandlerThread mHandlerThread;
     private Context mContext;
 
@@ -94,7 +94,7 @@
         mHandlerThread = new HandlerThread(TAG);
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
-        mCameraListener = new BlockingStateListener();
+        mCameraListener = new BlockingStateCallback();
         Camera2MultiViewStubActivity activity = (Camera2MultiViewStubActivity) mContext;
         mTextureView[0] = activity.getTextureView(0);
         mTextureView[1] = activity.getTextureView(1);
@@ -229,7 +229,7 @@
     }
 
     protected void startPreview(
-            String cameraId, List<Surface> outputSurfaces, CaptureListener listener)
+            String cameraId, List<Surface> outputSurfaces, CaptureCallback listener)
             throws Exception {
         CameraHolder camera = getCameraHolder(cameraId);
         assertTrue("Camera " + cameraId + " is not openned", camera.isOpenned());
@@ -339,7 +339,7 @@
         private CameraDevice mCamera;
         private StaticMetadata mStaticInfo;
         private List<Size> mOrderedPreviewSizes;
-        private BlockingSessionListener mSessionListener;
+        private BlockingSessionCallback mSessionListener;
 
         public CameraHolder(String id){
             mCameraId = id;
@@ -380,9 +380,9 @@
             mOrderedPreviewSizes = null;
         }
 
-        public void startPreview(List<Surface> outputSurfaces, CaptureListener listener)
+        public void startPreview(List<Surface> outputSurfaces, CaptureCallback listener)
                 throws Exception {
-            mSessionListener = new BlockingSessionListener();
+            mSessionListener = new BlockingSessionCallback();
             mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
 
             // TODO: vary the different settings like crop region to cover more cases.
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
index 9232151..bd8b546 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
@@ -17,7 +17,7 @@
 package android.hardware.camera2.cts.testcases;
 
 import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingStateListener.STATE_CLOSED;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.STATE_CLOSED;
 
 import android.hardware.camera2.params.StreamConfigurationMap;
 import android.media.ImageReader;
@@ -33,7 +33,7 @@
 import android.graphics.ImageFormat;
 import android.hardware.camera2.CameraAccessException;
 import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
 import android.hardware.camera2.CameraDevice;
 import android.hardware.camera2.CameraManager;
 import android.hardware.camera2.CameraMetadata;
@@ -43,13 +43,13 @@
 import android.util.Range;
 import android.hardware.camera2.cts.Camera2SurfaceViewStubActivity;
 import android.hardware.camera2.cts.CameraTestUtils;
-import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureListener;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
 import android.hardware.camera2.cts.helpers.CameraErrorCollector;
 import android.hardware.camera2.cts.helpers.StaticMetadata;
 import android.hardware.camera2.cts.helpers.StaticMetadata.CheckLevel;
 
-import com.android.ex.camera2.blocking.BlockingSessionListener;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
 import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
 
 import java.util.ArrayList;
@@ -61,7 +61,7 @@
  *
  * <p>This class encapsulates the SurfaceView based preview common functionalities.
  * The setup and teardown of CameraManager, test HandlerThread, Activity, Camera IDs
- * and CameraStateListener are handled in this class. Some basic preview related utility
+ * and CameraStateCallback are handled in this class. Some basic preview related utility
  * functions are provided to facilitate the derived preview-based test classes.
  * </p>
  */
@@ -85,8 +85,8 @@
     protected String[] mCameraIds;
     protected HandlerThread mHandlerThread;
     protected Handler mHandler;
-    protected BlockingStateListener mCameraListener;
-    protected BlockingSessionListener mSessionListener;
+    protected BlockingStateCallback mCameraListener;
+    protected BlockingSessionCallback mSessionListener;
     protected CameraErrorCollector mCollector;
     // Per device fields:
     protected StaticMetadata mStaticInfo;
@@ -110,7 +110,7 @@
     protected void setUp() throws Exception {
         /**
          * Set up the camera preview required environments, including activity,
-         * CameraManager, HandlerThread, Camera IDs, and CameraStateListener.
+         * CameraManager, HandlerThread, Camera IDs, and CameraStateCallback.
          */
         super.setUp();
         mContext = getActivity();
@@ -128,7 +128,7 @@
         mHandlerThread = new HandlerThread(TAG);
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
-        mCameraListener = new BlockingStateListener();
+        mCameraListener = new BlockingStateCallback();
         mCollector = new CameraErrorCollector();
     }
 
@@ -164,7 +164,7 @@
      *            capture is available.
      */
     protected void startPreview(CaptureRequest.Builder request, Size previewSz,
-            CaptureListener listener) throws Exception {
+            CaptureCallback listener) throws Exception {
         // Update preview size.
         updatePreviewSurface(previewSz);
         if (VERBOSE) {
@@ -185,7 +185,7 @@
             throws CameraAccessException {
         List<Surface> outputSurfaces = new ArrayList<Surface>(/*capacity*/1);
         outputSurfaces.add(mPreviewSurface);
-        mSessionListener = new BlockingSessionListener();
+        mSessionListener = new BlockingSessionCallback();
         mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
 
         request.addTarget(mPreviewSurface);
@@ -233,7 +233,7 @@
      */
     protected void prepareStillCaptureAndStartPreview(CaptureRequest.Builder previewRequest,
             CaptureRequest.Builder stillRequest, Size previewSz, Size stillSz,
-            CaptureListener resultListener,
+            CaptureCallback resultListener,
             ImageReader.OnImageAvailableListener imageListener) throws Exception {
         prepareCaptureAndStartPreview(previewRequest, stillRequest, previewSz, stillSz,
                 ImageFormat.JPEG, resultListener, MAX_READER_IMAGES, imageListener);
@@ -252,7 +252,7 @@
      */
     protected void prepareStillCaptureAndStartPreview(CaptureRequest.Builder previewRequest,
             CaptureRequest.Builder stillRequest, Size previewSz, Size stillSz,
-            CaptureListener resultListener, int maxNumImages,
+            CaptureCallback resultListener, int maxNumImages,
             ImageReader.OnImageAvailableListener imageListener) throws Exception {
         prepareCaptureAndStartPreview(previewRequest, stillRequest, previewSz, stillSz,
                 ImageFormat.JPEG, resultListener, maxNumImages, imageListener);
@@ -274,7 +274,7 @@
      */
     protected void prepareRawCaptureAndStartPreview(CaptureRequest.Builder previewRequest,
             CaptureRequest.Builder rawRequest, Size previewSz, Size rawSz,
-            CaptureListener resultListener,
+            CaptureCallback resultListener,
             ImageReader.OnImageAvailableListener imageListener) throws Exception {
         prepareCaptureAndStartPreview(previewRequest, rawRequest, previewSz, rawSz,
                 ImageFormat.RAW_SENSOR, resultListener, MAX_READER_IMAGES, imageListener);
@@ -295,7 +295,7 @@
      * seen before the result matching myRequest arrives, or each individual wait
      * for result times out after {@value #WAIT_FOR_RESULT_TIMEOUT_MS}ms.
      */
-    protected static <T> void waitForResultValue(SimpleCaptureListener listener,
+    protected static <T> void waitForResultValue(SimpleCaptureCallback listener,
             CaptureResult.Key<T> resultKey,
             T expectedValue, int numResultsWait) {
         List<T> expectedValues = new ArrayList<T>();
@@ -319,7 +319,7 @@
      * seen before the result matching myRequest arrives, or each individual wait
      * for result times out after {@value #WAIT_FOR_RESULT_TIMEOUT_MS}ms.
      */
-    protected static <T> void waitForAnyResultValue(SimpleCaptureListener listener,
+    protected static <T> void waitForAnyResultValue(SimpleCaptureCallback listener,
             CaptureResult.Key<T> resultKey,
             List<T> expectedValues, int numResultsWait) {
         if (numResultsWait < 0 || listener == null || expectedValues == null) {
@@ -370,7 +370,7 @@
      * @throws CameraAccessException if capturing failed
      */
     protected int captureRequestsSynchronized(
-            CaptureRequest request, CaptureListener listener, Handler handler)
+            CaptureRequest request, CaptureCallback listener, Handler handler)
                     throws CameraAccessException {
         return captureRequestsSynchronized(request, /*count*/1, listener, handler);
     }
@@ -398,7 +398,7 @@
      * @throws CameraAccessException if capturing failed
      */
     protected int captureRequestsSynchronized(
-            CaptureRequest request, int count, CaptureListener listener, Handler handler)
+            CaptureRequest request, int count, CaptureCallback listener, Handler handler)
                     throws CameraAccessException {
         if (count < 1) {
             throw new IllegalArgumentException("count must be positive");
@@ -428,7 +428,7 @@
      *
      * @return the last result, or {@code null} if there was none
      */
-    protected static CaptureResult waitForNumResults(SimpleCaptureListener resultListener,
+    protected static CaptureResult waitForNumResults(SimpleCaptureCallback resultListener,
             int numResultsWait) {
         if (numResultsWait < 0 || resultListener == null) {
             throw new IllegalArgumentException(
@@ -450,7 +450,7 @@
      * @param numResultWaitForUnknownLatency Number of frame to wait if camera device latency is
      *                                       unknown.
      */
-    protected void waitForSettingsApplied(SimpleCaptureListener resultListener,
+    protected void waitForSettingsApplied(SimpleCaptureCallback resultListener,
             int numResultWaitForUnknownLatency) {
         int maxLatency = mStaticInfo.getSyncMaxLatency();
         if (maxLatency == CameraMetadata.SYNC_MAX_LATENCY_UNKNOWN) {
@@ -475,7 +475,7 @@
      * @param numResultWaitForUnknownLatency Number of frame to wait if camera device latency is
      *                                       unknown.
      */
-    protected void waitForAeStable(SimpleCaptureListener resultListener,
+    protected void waitForAeStable(SimpleCaptureCallback resultListener,
             int numResultWaitForUnknownLatency) {
         waitForSettingsApplied(resultListener, numResultWaitForUnknownLatency);
 
@@ -504,7 +504,7 @@
      * @param numResultWaitForUnknownLatency Number of frame to wait if camera device latency is
      *                                       unknown.
      */
-    protected void waitForAeLocked(SimpleCaptureListener resultListener,
+    protected void waitForAeLocked(SimpleCaptureCallback resultListener,
             int numResultWaitForUnknownLatency) {
 
         waitForSettingsApplied(resultListener, numResultWaitForUnknownLatency);
@@ -629,7 +629,7 @@
      */
     protected void prepareCaptureAndStartPreview(CaptureRequest.Builder previewRequest,
             CaptureRequest.Builder stillRequest, Size previewSz, Size captureSz, int format,
-            CaptureListener resultListener, int maxNumImages,
+            CaptureCallback resultListener, int maxNumImages,
             ImageReader.OnImageAvailableListener imageListener) throws Exception {
         if (VERBOSE) {
             Log.v(TAG, String.format("Prepare single capture (%s) and preview (%s)",
@@ -646,7 +646,7 @@
         List<Surface> outputSurfaces = new ArrayList<Surface>();
         outputSurfaces.add(mPreviewSurface);
         outputSurfaces.add(mReaderSurface);
-        mSessionListener = new BlockingSessionListener();
+        mSessionListener = new BlockingSessionCallback();
         mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
 
         // Configure the requests.
diff --git a/tests/tests/permission/src/android/permission/cts/Camera2PermissionTest.java b/tests/tests/permission/src/android/permission/cts/Camera2PermissionTest.java
index f9e19e0..021a501 100644
--- a/tests/tests/permission/src/android/permission/cts/Camera2PermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/Camera2PermissionTest.java
@@ -16,7 +16,7 @@
 
 package android.permission.cts;
 
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
 
 import android.content.Context;
 import android.hardware.camera2.CameraDevice;
@@ -27,7 +27,7 @@
 import android.util.Log;
 
 import com.android.ex.camera2.blocking.BlockingCameraManager;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
 
 /**
  * Tests for Camera2 API related Permissions. Currently, this means
@@ -40,7 +40,7 @@
 
     private CameraManager mCameraManager;
     private CameraDevice mCamera;
-    private BlockingStateListener mCameraListener;
+    private BlockingStateCallback mCameraListener;
     private String[] mCameraIds;
     protected Handler mHandler;
     protected HandlerThread mHandlerThread;
@@ -54,7 +54,7 @@
 
     /**
      * Set up the camera2 test case required environments, including CameraManager,
-     * HandlerThread, Camera IDs, and CameraStateListener etc.
+     * HandlerThread, Camera IDs, and CameraStateCallback etc.
      */
     @Override
     protected void setUp() throws Exception {
@@ -64,7 +64,7 @@
         mHandlerThread = new HandlerThread(TAG);
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
-        mCameraListener = new BlockingStateListener();
+        mCameraListener = new BlockingStateCallback();
     }
 
     @Override
@@ -96,20 +96,20 @@
     /**
      * Add and remove availability listeners should work without permission.
      */
-    public void testAvailabilityListener() throws Exception {
+    public void testAvailabilityCallback() throws Exception {
         DummyCameraListener availabilityListener = new DummyCameraListener();
         // Remove a not-registered listener is a no-op.
-        mCameraManager.removeAvailabilityListener(availabilityListener);
-        mCameraManager.addAvailabilityListener(availabilityListener, mHandler);
-        mCameraManager.removeAvailabilityListener(availabilityListener);
-        mCameraManager.addAvailabilityListener(availabilityListener, mHandler);
-        mCameraManager.addAvailabilityListener(availabilityListener, mHandler);
-        mCameraManager.removeAvailabilityListener(availabilityListener);
+        mCameraManager.unregisterAvailabilityCallback(availabilityListener);
+        mCameraManager.registerAvailabilityCallback(availabilityListener, mHandler);
+        mCameraManager.unregisterAvailabilityCallback(availabilityListener);
+        mCameraManager.registerAvailabilityCallback(availabilityListener, mHandler);
+        mCameraManager.registerAvailabilityCallback(availabilityListener, mHandler);
+        mCameraManager.unregisterAvailabilityCallback(availabilityListener);
         // Remove a previously-added listener second time is a no-op.
-        mCameraManager.removeAvailabilityListener(availabilityListener);
+        mCameraManager.unregisterAvailabilityCallback(availabilityListener);
     }
 
-    private class DummyCameraListener extends CameraManager.AvailabilityListener {
+    private class DummyCameraListener extends CameraManager.AvailabilityCallback {
         @Override
         public void onCameraAvailable(String cameraId) {
         }
@@ -132,4 +132,3 @@
         }
     }
 }
-
