Skip to content

Commit ade01a5

Browse files
committed
fix: clean android impl
1 parent 3fe37e2 commit ade01a5

File tree

2 files changed

+32
-11
lines changed

2 files changed

+32
-11
lines changed

package/scripts/clean-shared-native-copies.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,17 @@ set -euo pipefail
55
TARGET="${1:-all}"
66

77
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
8+
STATE_DIR="$ROOT_DIR/shared-native/.sync-state"
89

910
clean_package() {
1011
local package_name="$1"
1112
local android_dir="$ROOT_DIR/$package_name/android/src/main/java/com/streamchatreactnative/shared"
1213
local ios_dir="$ROOT_DIR/$package_name/ios/shared"
1314

1415
rm -rf "$android_dir" "$ios_dir"
16+
rm -f \
17+
"$STATE_DIR/${package_name}_android.manifest" \
18+
"$STATE_DIR/${package_name}_ios.manifest"
1519
}
1620

1721
case "$TARGET" in

package/shared-native/android/StreamVideoThumbnailGenerator.kt

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.content.Context
44
import android.graphics.Bitmap
55
import android.media.MediaMetadataRetriever
66
import android.net.Uri
7+
import android.os.Build
78
import java.io.File
89
import java.io.FileOutputStream
910
import java.util.concurrent.Executors
@@ -14,8 +15,8 @@ data class StreamVideoThumbnailResult(
1415
)
1516

1617
object StreamVideoThumbnailGenerator {
17-
private const val DEFAULT_COMPRESSION_QUALITY = 70
18-
private const val DEFAULT_MAX_DIMENSION = 256
18+
private const val DEFAULT_COMPRESSION_QUALITY = 80
19+
private const val DEFAULT_MAX_DIMENSION = 512
1920
private const val CACHE_VERSION = "v1"
2021
private const val CACHE_DIRECTORY_NAME = "@stream-io-stream-video-thumbnails"
2122
private const val MAX_CONCURRENT_GENERATIONS = 5
@@ -63,19 +64,13 @@ object StreamVideoThumbnailGenerator {
6364

6465
return try {
6566
setDataSource(retriever, context, url)
66-
val frame =
67-
retriever.getFrameAtTime(100000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC)
68-
?: throw IllegalStateException("Failed to extract video frame for $url")
69-
val scaledFrame = scaleBitmap(frame)
67+
val thumbnail = extractThumbnailFrame(retriever, url)
7068

7169
FileOutputStream(outputFile).use { stream ->
72-
scaledFrame.compress(Bitmap.CompressFormat.JPEG, DEFAULT_COMPRESSION_QUALITY, stream)
70+
thumbnail.compress(Bitmap.CompressFormat.JPEG, DEFAULT_COMPRESSION_QUALITY, stream)
7371
}
7472

75-
if (scaledFrame != frame) {
76-
scaledFrame.recycle()
77-
}
78-
frame.recycle()
73+
thumbnail.recycle()
7974

8075
Uri.fromFile(outputFile).toString()
8176
} catch (error: Throwable) {
@@ -89,6 +84,28 @@ object StreamVideoThumbnailGenerator {
8984
}
9085
}
9186

87+
private fun extractThumbnailFrame(retriever: MediaMetadataRetriever, url: String): Bitmap {
88+
if (Build.VERSION.SDK_INT >= 27) {
89+
return retriever.getScaledFrameAtTime(
90+
100000,
91+
MediaMetadataRetriever.OPTION_CLOSEST_SYNC,
92+
DEFAULT_MAX_DIMENSION,
93+
DEFAULT_MAX_DIMENSION,
94+
) ?: throw IllegalStateException("Failed to extract video frame for $url")
95+
}
96+
97+
val frame =
98+
retriever.getFrameAtTime(100000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC)
99+
?: throw IllegalStateException("Failed to extract video frame for $url")
100+
val scaledFrame = scaleBitmap(frame)
101+
102+
if (scaledFrame != frame) {
103+
frame.recycle()
104+
}
105+
106+
return scaledFrame
107+
}
108+
92109
private fun buildCacheFileName(url: String): String {
93110
val cacheKey =
94111
fnv1a64("$CACHE_VERSION|$DEFAULT_MAX_DIMENSION|$DEFAULT_COMPRESSION_QUALITY|$url")

0 commit comments

Comments
 (0)