diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataHandler.kt index d35b00134..2d8656cbb 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/MetadataHandler.kt @@ -593,10 +593,11 @@ class MetadataHandler(private val context: Context) : MethodCallHandler { KEY_PAGE to i, KEY_MIME_TYPE to trackMime, ) + + // do not use `MediaFormat.KEY_TRACK_ID` as it is actually not unique between tracks + // e.g. there could be both a video track and an image track with KEY_TRACK_ID == 1 + format.getSafeInt(MediaFormat.KEY_IS_DEFAULT) { page[KEY_IS_DEFAULT] = it != 0 } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - format.getSafeInt(MediaFormat.KEY_TRACK_ID) { page[KEY_TRACK_ID] = it } - } format.getSafeInt(MediaFormat.KEY_WIDTH) { page[KEY_WIDTH] = it } format.getSafeInt(MediaFormat.KEY_HEIGHT) { page[KEY_HEIGHT] = it } if (isVideo(trackMime)) { @@ -875,7 +876,6 @@ class MetadataHandler(private val context: Context) : MethodCallHandler { private const val KEY_HEIGHT = "height" private const val KEY_WIDTH = "width" private const val KEY_PAGE = "page" - private const val KEY_TRACK_ID = "trackId" private const val KEY_IS_DEFAULT = "isDefault" private const val KEY_DURATION = "durationMillis" diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/decoder/MultiTrackImageGlideModule.kt b/android/app/src/main/kotlin/deckers/thibault/aves/decoder/MultiTrackImageGlideModule.kt index 290b7badd..80a158fab 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/decoder/MultiTrackImageGlideModule.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/decoder/MultiTrackImageGlideModule.kt @@ -27,7 +27,7 @@ class MultiTrackImageGlideModule : LibraryGlideModule() { } } -class MultiTrackImage(val context: Context, val uri: Uri, val trackId: Int?) +class MultiTrackImage(val context: Context, val uri: Uri, val trackIndex: Int?) internal class MultiTrackThumbnailLoader : ModelLoader { override fun buildLoadData(model: MultiTrackImage, width: Int, height: Int, options: Options): ModelLoader.LoadData { @@ -52,9 +52,9 @@ internal class MultiTrackImageFetcher(val model: MultiTrackImage, val width: Int val context = model.context val uri = model.uri - val trackId = model.trackId + val trackIndex = model.trackIndex - val bitmap = MultiTrackMedia.getImage(context, uri, trackId) + val bitmap = MultiTrackMedia.getImage(context, uri, trackIndex) if (bitmap == null) { callback.onLoadFailed(Exception("null bitmap")) } else { diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiTrackMedia.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiTrackMedia.kt index 8ac8dad05..acd72a5d5 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiTrackMedia.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/MultiTrackMedia.kt @@ -16,17 +16,17 @@ object MultiTrackMedia { private val LOG_TAG = LogUtils.createTag(MultiTrackMedia::class.java) @RequiresApi(Build.VERSION_CODES.P) - fun getImage(context: Context, uri: Uri, trackId: Int?): Bitmap? { + fun getImage(context: Context, uri: Uri, trackIndex: Int?): Bitmap? { val retriever = StorageUtils.openMetadataRetriever(context, uri) ?: return null try { - return if (trackId != null) { - val imageIndex = trackIdToImageIndex(context, uri, trackId) ?: return null + return if (trackIndex != null) { + val imageIndex = trackIndexToImageIndex(context, uri, trackIndex) ?: return null retriever.getImageAtIndex(imageIndex) } else { retriever.primaryImage } } catch (e: Exception) { - Log.w(LOG_TAG, "failed to extract image from uri=$uri trackId=$trackId", e) + Log.w(LOG_TAG, "failed to extract image from uri=$uri trackIndex=$trackIndex", e) } finally { // cannot rely on `MediaMetadataRetriever` being `AutoCloseable` on older APIs retriever.release() @@ -34,7 +34,7 @@ object MultiTrackMedia { return null } - private fun trackIdToImageIndex(context: Context, uri: Uri, trackId: Int): Int? { + private fun trackIndexToImageIndex(context: Context, uri: Uri, trackIndex: Int): Int? { val extractor = MediaExtractor() try { extractor.setDataSource(context, uri, null) @@ -42,7 +42,7 @@ object MultiTrackMedia { var imageIndex = 0 for (i in 0 until trackCount) { val trackFormat = extractor.getTrackFormat(i) - if (trackId == trackFormat.getInteger(MediaFormat.KEY_TRACK_ID)) { + if (trackIndex == i) { return imageIndex } if (MimeTypes.isImage(trackFormat.getString(MediaFormat.KEY_MIME))) { @@ -50,7 +50,7 @@ object MultiTrackMedia { } } } catch (e: Exception) { - Log.w(LOG_TAG, "failed to get image index for uri=$uri, trackId=$trackId", e) + Log.w(LOG_TAG, "failed to get image index for uri=$uri, trackIndex=$trackIndex", e) } finally { extractor.release() } diff --git a/android/build.gradle b/android/build.gradle index 3a1c6361f..20832a077 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,6 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.30' + ext.kotlin_version = '1.4.31' repositories { google() mavenCentral() diff --git a/lib/model/multipage.dart b/lib/model/multipage.dart index 257b09e85..2006b24ee 100644 --- a/lib/model/multipage.dart +++ b/lib/model/multipage.dart @@ -71,7 +71,7 @@ class SinglePageInfo implements Comparable { final index = map['page'] as int; return SinglePageInfo( index: index, - pageId: map['trackId'] as int ?? index, + pageId: index, mimeType: map['mimeType'] as String, isDefault: map['isDefault'] as bool ?? false, width: map['width'] as int ?? 0,