summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2023-05-18 00:02:35 +0000
committer Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> 2023-05-18 00:02:35 +0000
commitc2ee05cfb68e741736fd284a6debe43352885441 (patch)
tree3d7e20880d5d86d9fec251754360fee8d1d28992 /java/src
parent7e2893ce961e18b8b506e2686aa26c63ce3105a7 (diff)
parent9f16294a877aad18fa237d856bc5b9fa5085d7ce (diff)
Merge "Limit the number of parallel preview loadings in the image preview loader." into udc-dev am: 9f16294a87
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/modules/IntentResolver/+/23268599 Change-Id: I0b0049dd0213f686006cf3ff80aa996e737e4e1f Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'java/src')
-rw-r--r--java/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoader.kt29
1 files changed, 23 insertions, 6 deletions
diff --git a/java/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoader.kt b/java/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoader.kt
index 89b79a0a..22dd1125 100644
--- a/java/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoader.kt
+++ b/java/src/com/android/intentresolver/contentpreview/ImagePreviewImageLoader.kt
@@ -26,28 +26,42 @@ import androidx.annotation.VisibleForTesting
import androidx.collection.LruCache
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.coroutineScope
+import java.util.function.Consumer
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
-import java.util.function.Consumer
+import kotlinx.coroutines.sync.Semaphore
private const val TAG = "ImagePreviewImageLoader"
/**
- * Implements preview image loading for the content preview UI. Provides requests deduplication and
- * image caching.
+ * Implements preview image loading for the content preview UI. Provides requests deduplication,
+ * image caching, and a limit on the number of parallel loadings.
*/
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
-class ImagePreviewImageLoader(
+class ImagePreviewImageLoader
+@VisibleForTesting
+constructor(
private val scope: CoroutineScope,
thumbnailSize: Int,
private val contentResolver: ContentResolver,
cacheSize: Int,
+ // TODO: consider providing a scope with the dispatcher configured with
+ // [CoroutineDispatcher#limitedParallelism] instead
+ private val contentResolverSemaphore: Semaphore,
) : ImageLoader {
+ constructor(
+ scope: CoroutineScope,
+ thumbnailSize: Int,
+ contentResolver: ContentResolver,
+ cacheSize: Int,
+ maxSimultaneousRequests: Int = 4
+ ) : this(scope, thumbnailSize, contentResolver, cacheSize, Semaphore(maxSimultaneousRequests))
+
private val thumbnailSize: Size = Size(thumbnailSize, thumbnailSize)
private val lock = Any()
@@ -103,13 +117,16 @@ class ImagePreviewImageLoader(
}
}
- private fun RequestRecord.loadBitmap() {
+ private suspend fun RequestRecord.loadBitmap() {
+ contentResolverSemaphore.acquire()
val bitmap =
try {
contentResolver.loadThumbnail(uri, thumbnailSize, null)
} catch (t: Throwable) {
Log.d(TAG, "failed to load $uri preview", t)
null
+ } finally {
+ contentResolverSemaphore.release()
}
complete(bitmap)
}
@@ -136,4 +153,4 @@ class ImagePreviewImageLoader(
val deferred: CompletableDeferred<Bitmap?>,
@GuardedBy("lock") var caching: Boolean
)
-} \ No newline at end of file
+}