Merge "Support a "System" toggle in CTS-Verifier. When it's enabled:" into android14-tests-dev
diff --git a/tests/tests/car/src/android/car/cts/CarOccupantConnectionManagerTest.java b/tests/tests/car/src/android/car/cts/CarOccupantConnectionManagerTest.java
index ea49be4..2c729b4 100644
--- a/tests/tests/car/src/android/car/cts/CarOccupantConnectionManagerTest.java
+++ b/tests/tests/car/src/android/car/cts/CarOccupantConnectionManagerTest.java
@@ -72,6 +72,7 @@
     private static final long WAIT_BEFORE_RESPOND_TO_REQUEST_MS = 2_000;
     private static final long CALLBACK_TIMEOUT_MS = WAIT_BEFORE_RESPOND_TO_REQUEST_MS + 2_000;
     private static final long EXCHANGE_PAYLOAD_TIMEOUT_MS = 10_000;
+    private static final long POLLING_CHECK_TIMEOUT_MS = 3_000;
 
     private static final Payload PAYLOAD1 = new Payload(HexFormat.of().parseHex("1234"));
     private static final Payload PAYLOAD2 = new Payload(HexFormat.of().parseHex("5678"));
@@ -114,19 +115,19 @@
             "android.car.occupantconnection.CarOccupantConnectionManager#unregisterReceiver",
             "android.car.occupantconnection.AbstractReceiverService#getAllReceiverEndpoints",
             "android.car.occupantconnection.AbstractReceiverService#onLocalServiceBind"})
-    public void testRegisterAndUnregisterReceiver() {
+    public void testRegisterAndUnregisterReceiver() throws Exception {
         mOccupantConnectionManager.registerReceiver(RECEIVER_ID, mExecutor,
                 (senderZone, payload) -> {
                 });
         TestReceiverService receiverService = bindToLocalReceiverServiceAndWait();
 
-        assertWithMessage("Failed to register the receiver").that(
-                receiverService.getAllReceiverEndpoints().contains(RECEIVER_ID)).isTrue();
+        PollingCheck.check("Failed to register the receiver", POLLING_CHECK_TIMEOUT_MS,
+                () -> receiverService.getAllReceiverEndpoints().contains(RECEIVER_ID));
 
         mOccupantConnectionManager.unregisterReceiver(RECEIVER_ID);
 
-        assertWithMessage("Failed to unregister the receiver").that(
-                receiverService.getAllReceiverEndpoints().isEmpty()).isTrue();
+        PollingCheck.check("Failed to unregister the receiver", POLLING_CHECK_TIMEOUT_MS,
+                () -> receiverService.getAllReceiverEndpoints().isEmpty());
     }
 
     @Test
@@ -388,6 +389,7 @@
 
         @Override
         public void onReceiverRegistered(String receiverEndpointId) {
+            Log.v(TAG, "onReceiverRegistered:" + receiverEndpointId);
         }
 
         @Override
diff --git a/tests/tests/media/decoder/src/android/media/decoder/cts/DecodeAccuracyTestBase.java b/tests/tests/media/decoder/src/android/media/decoder/cts/DecodeAccuracyTestBase.java
index 5743455..e30f56b 100644
--- a/tests/tests/media/decoder/src/android/media/decoder/cts/DecodeAccuracyTestBase.java
+++ b/tests/tests/media/decoder/src/android/media/decoder/cts/DecodeAccuracyTestBase.java
@@ -979,6 +979,10 @@
         return glSurfaceViewThread.getByteBuffer();
     }
 
+    public Object getSyncToken() {
+        return surfaceSyncToken;
+    }
+
     /* Does all GL operations. */
     private class GLSurfaceViewThread extends Thread
             implements SurfaceTexture.OnFrameAvailableListener {
@@ -1219,11 +1223,13 @@
 
         /* Reads the pixels to a ByteBuffer. */
         public void saveFrame() {
-            byteBufferIsReady = false;
-            byteBuffer.clear();
-            GLES20.glReadPixels(0, 0, VIEW_WIDTH, VIEW_HEIGHT, GLES20.GL_RGBA,
-                    GLES20.GL_UNSIGNED_BYTE, byteBuffer);
-            byteBufferIsReady = true;
+            synchronized (surfaceSyncToken) {
+                byteBufferIsReady = false;
+                byteBuffer.clear();
+                GLES20.glReadPixels(0, 0, VIEW_WIDTH, VIEW_HEIGHT, GLES20.GL_RGBA,
+                        GLES20.GL_UNSIGNED_BYTE, byteBuffer);
+                byteBufferIsReady = true;
+            }
         }
 
         public int getTextureId() {
@@ -1517,10 +1523,14 @@
         try {
             final ByteBuffer byteBuffer = glSurfaceViewFactory.getByteBuffer();
             bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
-            byteBuffer.rewind();
-            bitmap.copyPixelsFromBuffer(byteBuffer);
-            bitmapIsReady = true;
-            byteBuffer.clear();
+
+            final Object syncToken = glSurfaceViewFactory.getSyncToken();
+            synchronized (syncToken) {
+                byteBuffer.rewind();
+                bitmap.copyPixelsFromBuffer(byteBuffer);
+                bitmapIsReady = true;
+                byteBuffer.clear();
+            }
         } catch (NullPointerException exception) {
             Log.e(TAG, "glSurfaceViewFactory or byteBuffer may have been released", exception);
             bitmap = null;
diff --git a/tests/tests/media/decoder/src/android/media/decoder/cts/DecodeOnlyTest.java b/tests/tests/media/decoder/src/android/media/decoder/cts/DecodeOnlyTest.java
index ac0c24e..1d12018 100644
--- a/tests/tests/media/decoder/src/android/media/decoder/cts/DecodeOnlyTest.java
+++ b/tests/tests/media/decoder/src/android/media/decoder/cts/DecodeOnlyTest.java
@@ -643,6 +643,7 @@
         Thread.sleep(500);
         videoCodec.flush();
         audioCodec.flush();
+        audioTrack.flush();
         videoAsyncHandler.clearBufferQueue();
 
         // Frames at 7s of each file are not key frame, and there is non-zero key frame before it