From ae71b7bc6418757312665bf9db7de0b39848008c Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Mon, 13 Jul 2026 12:19:21 +0200 Subject: [PATCH] fix(android): guard API 29 codec query close #1553 --- .../com/edde746/plezy/shared/MediaCodecQuery.kt | 13 ++++++++++++- .../edde746/plezy/shared/MediaCodecQueryTest.kt | 16 ++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/kotlin/com/edde746/plezy/shared/MediaCodecQuery.kt b/android/app/src/main/kotlin/com/edde746/plezy/shared/MediaCodecQuery.kt index 0929fc97..796a014a 100644 --- a/android/app/src/main/kotlin/com/edde746/plezy/shared/MediaCodecQuery.kt +++ b/android/app/src/main/kotlin/com/edde746/plezy/shared/MediaCodecQuery.kt @@ -23,7 +23,18 @@ internal object MediaCodecQuery { return null } - fun isHardwareAccelerated(info: MediaCodecInfo): Boolean = isHardwareAccelerated(Build.VERSION.SDK_INT, info.isHardwareAccelerated, info.name) + fun isHardwareAccelerated(info: MediaCodecInfo): Boolean { + val sdkInt = Build.VERSION.SDK_INT + val name = info.name + return if (sdkInt >= Build.VERSION_CODES.Q) { + isHardwareAccelerated(sdkInt, info.isHardwareAccelerated, name) + } else { + // MediaCodecInfo.isHardwareAccelerated() does not exist before API 29. + // Keep the call inside the version gate so older Fire OS releases do not + // fail with NoSuchMethodError while initializing playback. + isHardwareAccelerated(sdkInt, false, name) + } + } internal fun isHardwareAccelerated( sdkInt: Int, diff --git a/android/app/src/test/kotlin/com/edde746/plezy/shared/MediaCodecQueryTest.kt b/android/app/src/test/kotlin/com/edde746/plezy/shared/MediaCodecQueryTest.kt index 439ae0a4..05fa84bd 100644 --- a/android/app/src/test/kotlin/com/edde746/plezy/shared/MediaCodecQueryTest.kt +++ b/android/app/src/test/kotlin/com/edde746/plezy/shared/MediaCodecQueryTest.kt @@ -3,9 +3,25 @@ package com.edde746.plezy.shared import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import org.robolectric.annotation.Config +import org.robolectric.shadows.MediaCodecInfoBuilder +@RunWith(RobolectricTestRunner::class) +@Config(sdk = [25, 28]) class MediaCodecQueryTest { + @Test + fun preApi29CodecQueryDoesNotInvokeApi29HardwareFlag() { + val codecInfo = MediaCodecInfoBuilder.newBuilder() + .setName("OMX.qcom.video.decoder.avc") + .setIsHardwareAccelerated(false) + .build() + + assertTrue(MediaCodecQuery.isHardwareAccelerated(codecInfo)) + } + @Test fun recognizesKnownPlatformAndFfmpegSoftwareCodecNames() { listOf(