From f0e3e4f4706117998a731cb3db76bebb6d80ec3b Mon Sep 17 00:00:00 2001 From: Henry Fang Date: Wed, 15 Jul 2020 15:40:08 -0700 Subject: [PATCH] Fix MediaCas CTS failure TRM is checking input parameters and won't allow null executor. Use context main executor to call Tuner Resource Manager (TRM) Also fix ConcurrentModificationException when use HashMap.forEach to free element in hashmap. Test: atest MediaCasTest bug: 161391585 Change-Id: Ie5111b46b5b601f0a5b56e5828d79771e153a210 --- media/java/android/media/MediaCas.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/media/java/android/media/MediaCas.java b/media/java/android/media/MediaCas.java index 590def4d4cedf..98ca2f9c42537 100644 --- a/media/java/android/media/MediaCas.java +++ b/media/java/android/media/MediaCas.java @@ -34,7 +34,6 @@ import android.media.tv.tunerresourcemanager.ResourceClientProfile; import android.media.tv.tunerresourcemanager.TunerResourceManager; import android.os.Bundle; import android.os.Handler; -import android.os.HandlerExecutor; import android.os.HandlerThread; import android.os.IHwBinder; import android.os.Looper; @@ -50,6 +49,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -392,7 +392,10 @@ public final class MediaCas implements AutoCloseable { @Override public void onReclaimResources() { synchronized (mSessionMap) { - mSessionMap.forEach((casSession, sessionResourceHandle) -> casSession.close()); + List sessionList = new ArrayList<>(mSessionMap.keySet()); + for (Session casSession: sessionList) { + casSession.close(); + } } mEventHandler.sendMessage(mEventHandler.obtainMessage( EventHandler.MSG_CAS_RESOURCE_LOST)); @@ -734,7 +737,7 @@ public final class MediaCas implements AutoCloseable { ResourceClientProfile profile = new ResourceClientProfile(tvInputServiceSessionId, priorityHint); mTunerResourceManager.registerClientProfile( - profile, new HandlerExecutor(mEventHandler), mResourceListener, clientId); + profile, context.getMainExecutor(), mResourceListener, clientId); mClientId = clientId[0]; } }