diff options
author | 2024-05-10 19:16:37 +0000 | |
---|---|---|
committer | 2024-05-10 19:16:37 +0000 | |
commit | 6b2802803702740646eb8f07bada2a4d2eec23b8 (patch) | |
tree | 4b9eeeb71f9819913498fd149fede5a9ed687509 | |
parent | f95a9b5c71a57d6daf9b75c58f543e7bc5debe12 (diff) | |
parent | b5c0bd45601a0d9406a78090c3b56fca3abd30c2 (diff) |
Merge "Use preview uri for previews (instead of item uri)" into main
9 files changed, 125 insertions, 55 deletions
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractor.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractor.kt index 9d62ffa2..c7d29a72 100644 --- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractor.kt +++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractor.kt @@ -241,10 +241,13 @@ constructor( unclaimedRecords: MutableUnclaimedMap, ): PreviewModel = unclaimedRecords.remove(row.uri)?.second - ?: PreviewModel( - uri = row.uri, - mimeType = uriMetadataReader.getMetadata(row.uri).mimeType, - ) + ?: uriMetadataReader.getMetadata(row.uri).let { metadata -> + PreviewModel( + uri = row.uri, + previewUri = metadata.previewUri, + mimeType = metadata.mimeType, + ) + } private fun <M : MutablePreviewMap> M.putAllUnclaimedRight(unclaimed: UnclaimedMap): M = putAllUnclaimedWhere(unclaimed) { it >= focusedItemIdx } diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractor.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractor.kt index 927a3a84..c87504e1 100644 --- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractor.kt +++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractor.kt @@ -60,7 +60,12 @@ constructor( // Restrict parallelism so as to not overload the metadata reader; anecdotally, too // many parallel queries causes failures. .mapParallel(parallelism = 4) { uri -> - PreviewModel(uri = uri, mimeType = uriMetadataReader.getMetadata(uri).mimeType) + val metadata = uriMetadataReader.getMetadata(uri) + PreviewModel( + uri = uri, + previewUri = metadata.previewUri, + mimeType = metadata.mimeType, + ) } .toSet() } diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewModel.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewModel.kt index ff96a9f4..6b805391 100644 --- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewModel.kt +++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewModel.kt @@ -20,10 +20,10 @@ import android.net.Uri /** An individual preview presented in Shareousel. */ data class PreviewModel( - /** - * Uri for this preview; if this preview is selected, this will be shared with the target app. - */ + /** Uri for this item; if this preview is selected, this will be shared with the target app. */ val uri: Uri, + /** Uri for the preview image. */ + val previewUri: Uri? = uri, /** Mimetype for the data [uri] points to. */ val mimeType: String?, ) diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModel.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModel.kt index 082581dc..cf118934 100644 --- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModel.kt +++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModel.kt @@ -113,7 +113,7 @@ object ShareouselViewModelModule { keySet.value?.maybeLoad(key) val previewInteractor = interactor.preview(key) ShareouselPreviewViewModel( - bitmap = flow { emit(imageLoader(key.uri)) }, + bitmap = flow { emit(key.previewUri?.let { imageLoader(it) }) }, contentType = flowOf(ContentType.Image), // TODO: convert from metadata isSelected = previewInteractor.isSelected, setSelected = previewInteractor::setSelected, diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractorTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractorTest.kt index 81e6b77d..9b786b74 100644 --- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractorTest.kt +++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/CursorPreviewsInteractorTest.kt @@ -53,7 +53,7 @@ class CursorPreviewsInteractorTest { this.pageSize = pageSize this.maxLoadedPages = maxLoadedPages uriMetadataReader = UriMetadataReader { - FileInfo.Builder(it).withMimeType("image/bitmap").build() + FileInfo.Builder(it).withPreviewUri(it).withMimeType("image/bitmap").build() } runTest { block( @@ -100,10 +100,22 @@ class CursorPreviewsInteractorTest { assertThat(cursorPreviewsRepository.previewsModel.value!!.loadMoreRight).isNull() assertThat(cursorPreviewsRepository.previewsModel.value!!.previewModels) .containsExactly( - PreviewModel(Uri.fromParts("scheme0", "ssp0", "fragment0"), "image/bitmap"), - PreviewModel(Uri.fromParts("scheme1", "ssp1", "fragment1"), "image/bitmap"), - PreviewModel(Uri.fromParts("scheme2", "ssp2", "fragment2"), "image/bitmap"), - PreviewModel(Uri.fromParts("scheme3", "ssp3", "fragment3"), "image/bitmap"), + PreviewModel( + uri = Uri.fromParts("scheme0", "ssp0", "fragment0"), + mimeType = "image/bitmap" + ), + PreviewModel( + uri = Uri.fromParts("scheme1", "ssp1", "fragment1"), + mimeType = "image/bitmap" + ), + PreviewModel( + uri = Uri.fromParts("scheme2", "ssp2", "fragment2"), + mimeType = "image/bitmap" + ), + PreviewModel( + uri = Uri.fromParts("scheme3", "ssp3", "fragment3"), + mimeType = "image/bitmap" + ), ) .inOrder() } diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractorTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractorTest.kt index da73f4cf..c9f71f49 100644 --- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractorTest.kt +++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/FetchPreviewsInteractorTest.kt @@ -62,7 +62,7 @@ class FetchPreviewsInteractorTest { contentUris = initialSelection.map { uri(it) } this.focusedItemIndex = focusedItemIndex uriMetadataReader = UriMetadataReader { - FileInfo.Builder(it).withMimeType("image/bitmap").build() + FileInfo.Builder(it).withPreviewUri(it).withMimeType("image/bitmap").build() } this.pageSize = pageSize this.maxLoadedPages = maxLoadedPages @@ -104,12 +104,12 @@ class FetchPreviewsInteractorTest { previewModels = setOf( PreviewModel( - Uri.fromParts("scheme1", "ssp1", "fragment1"), - "image/bitmap", + uri = Uri.fromParts("scheme1", "ssp1", "fragment1"), + mimeType = "image/bitmap", ), PreviewModel( - Uri.fromParts("scheme2", "ssp2", "fragment2"), - "image/bitmap", + uri = Uri.fromParts("scheme2", "ssp2", "fragment2"), + mimeType = "image/bitmap", ), ), startIdx = 1, @@ -132,10 +132,22 @@ class FetchPreviewsInteractorTest { assertThat(previewsModel.value!!.loadMoreRight).isNull() assertThat(previewsModel.value!!.previewModels) .containsExactly( - PreviewModel(Uri.fromParts("scheme0", "ssp0", "fragment0"), "image/bitmap"), - PreviewModel(Uri.fromParts("scheme1", "ssp1", "fragment1"), "image/bitmap"), - PreviewModel(Uri.fromParts("scheme2", "ssp2", "fragment2"), "image/bitmap"), - PreviewModel(Uri.fromParts("scheme3", "ssp3", "fragment3"), "image/bitmap"), + PreviewModel( + uri = Uri.fromParts("scheme0", "ssp0", "fragment0"), + mimeType = "image/bitmap" + ), + PreviewModel( + uri = Uri.fromParts("scheme1", "ssp1", "fragment1"), + mimeType = "image/bitmap" + ), + PreviewModel( + uri = Uri.fromParts("scheme2", "ssp2", "fragment2"), + mimeType = "image/bitmap" + ), + PreviewModel( + uri = Uri.fromParts("scheme3", "ssp3", "fragment3"), + mimeType = "image/bitmap" + ), ) .inOrder() } diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewInteractorTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewInteractorTest.kt index f8fc4911..a3c65570 100644 --- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewInteractorTest.kt +++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewInteractorTest.kt @@ -39,7 +39,8 @@ class SelectablePreviewInteractorTest { targetIntentModifier = TargetIntentModifier { error("unexpected invocation") } val underTest = SelectablePreviewInteractor( - key = PreviewModel(Uri.fromParts("scheme", "ssp", "fragment"), null), + key = + PreviewModel(uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = null), selectionInteractor = selectionInteractor, ) runCurrent() @@ -52,14 +53,23 @@ class SelectablePreviewInteractorTest { targetIntentModifier = TargetIntentModifier { error("unexpected invocation") } val underTest = SelectablePreviewInteractor( - key = PreviewModel(Uri.fromParts("scheme", "ssp", "fragment"), "image/bitmap"), + key = + PreviewModel( + uri = Uri.fromParts("scheme", "ssp", "fragment"), + mimeType = "image/bitmap" + ), selectionInteractor = selectionInteractor, ) assertThat(underTest.isSelected.first()).isFalse() previewSelectionsRepository.selections.value = - setOf(PreviewModel(Uri.fromParts("scheme", "ssp", "fragment"), "image/bitmap")) + setOf( + PreviewModel( + uri = Uri.fromParts("scheme", "ssp", "fragment"), + mimeType = "image/bitmap" + ) + ) runCurrent() assertThat(underTest.isSelected.first()).isTrue() @@ -71,7 +81,11 @@ class SelectablePreviewInteractorTest { targetIntentModifier = TargetIntentModifier { modifiedIntent } val underTest = SelectablePreviewInteractor( - key = PreviewModel(Uri.fromParts("scheme", "ssp", "fragment"), "image/bitmap"), + key = + PreviewModel( + uri = Uri.fromParts("scheme", "ssp", "fragment"), + mimeType = "image/bitmap" + ), selectionInteractor = selectionInteractor, ) @@ -80,7 +94,10 @@ class SelectablePreviewInteractorTest { assertThat(previewSelectionsRepository.selections.value) .containsExactly( - PreviewModel(Uri.fromParts("scheme", "ssp", "fragment"), "image/bitmap") + PreviewModel( + uri = Uri.fromParts("scheme", "ssp", "fragment"), + mimeType = "image/bitmap" + ) ) assertThat(chooserRequestRepository.chooserRequest.value.targetIntent) diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewsInteractorTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewsInteractorTest.kt index 5fa5cab4..be5ddfe5 100644 --- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewsInteractorTest.kt +++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectablePreviewsInteractorTest.kt @@ -41,12 +41,12 @@ class SelectablePreviewsInteractorTest { previewModels = setOf( PreviewModel( - Uri.fromParts("scheme", "ssp", "fragment"), - "image/bitmap", + uri = Uri.fromParts("scheme", "ssp", "fragment"), + mimeType = "image/bitmap", ), PreviewModel( - Uri.fromParts("scheme2", "ssp2", "fragment2"), - "image/bitmap", + uri = Uri.fromParts("scheme2", "ssp2", "fragment2"), + mimeType = "image/bitmap", ), ), startIdx = 0, @@ -55,7 +55,7 @@ class SelectablePreviewsInteractorTest { ) previewSelectionsRepository.selections.value = setOf( - PreviewModel(Uri.fromParts("scheme", "ssp", "fragment"), null), + PreviewModel(uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = null), ) targetIntentModifier = TargetIntentModifier { error("unexpected invocation") } val underTest = selectablePreviewsInteractor @@ -64,8 +64,14 @@ class SelectablePreviewsInteractorTest { assertThat(keySet.value).isNotNull() assertThat(keySet.value!!.previewModels) .containsExactly( - PreviewModel(Uri.fromParts("scheme", "ssp", "fragment"), "image/bitmap"), - PreviewModel(Uri.fromParts("scheme2", "ssp2", "fragment2"), "image/bitmap"), + PreviewModel( + uri = Uri.fromParts("scheme", "ssp", "fragment"), + mimeType = "image/bitmap" + ), + PreviewModel( + uri = Uri.fromParts("scheme2", "ssp2", "fragment2"), + mimeType = "image/bitmap" + ), ) .inOrder() assertThat(keySet.value!!.startIdx).isEqualTo(0) @@ -73,11 +79,15 @@ class SelectablePreviewsInteractorTest { assertThat(keySet.value!!.loadMoreRight).isNull() val firstModel = - underTest.preview(PreviewModel(Uri.fromParts("scheme", "ssp", "fragment"), null)) + underTest.preview( + PreviewModel(uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = null) + ) assertThat(firstModel.isSelected.first()).isTrue() val secondModel = - underTest.preview(PreviewModel(Uri.fromParts("scheme2", "ssp2", "fragment2"), null)) + underTest.preview( + PreviewModel(uri = Uri.fromParts("scheme2", "ssp2", "fragment2"), mimeType = null) + ) assertThat(secondModel.isSelected.first()).isFalse() } @@ -85,14 +95,16 @@ class SelectablePreviewsInteractorTest { fun keySet_reflectsRepositoryUpdate() = runKosmosTest { previewSelectionsRepository.selections.value = setOf( - PreviewModel(Uri.fromParts("scheme", "ssp", "fragment"), null), + PreviewModel(uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = null), ) targetIntentModifier = TargetIntentModifier { error("unexpected invocation") } val underTest = selectablePreviewsInteractor val previews = underTest.previews.stateIn(backgroundScope) val firstModel = - underTest.preview(PreviewModel(Uri.fromParts("scheme", "ssp", "fragment"), null)) + underTest.preview( + PreviewModel(uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = null) + ) assertThat(previews.value).isNull() assertThat(firstModel.isSelected.first()).isTrue() @@ -104,12 +116,12 @@ class SelectablePreviewsInteractorTest { previewModels = setOf( PreviewModel( - Uri.fromParts("scheme", "ssp", "fragment"), - "image/bitmap", + uri = Uri.fromParts("scheme", "ssp", "fragment"), + mimeType = "image/bitmap", ), PreviewModel( - Uri.fromParts("scheme2", "ssp2", "fragment2"), - "image/bitmap", + uri = Uri.fromParts("scheme2", "ssp2", "fragment2"), + mimeType = "image/bitmap", ), ), startIdx = 5, @@ -122,8 +134,14 @@ class SelectablePreviewsInteractorTest { assertThat(previews.value).isNotNull() assertThat(previews.value!!.previewModels) .containsExactly( - PreviewModel(Uri.fromParts("scheme", "ssp", "fragment"), "image/bitmap"), - PreviewModel(Uri.fromParts("scheme2", "ssp2", "fragment2"), "image/bitmap"), + PreviewModel( + uri = Uri.fromParts("scheme", "ssp", "fragment"), + mimeType = "image/bitmap" + ), + PreviewModel( + uri = Uri.fromParts("scheme2", "ssp2", "fragment2"), + mimeType = "image/bitmap" + ), ) .inOrder() assertThat(previews.value!!.startIdx).isEqualTo(5) diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModelTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModelTest.kt index 35ef6613..bd3d88f8 100644 --- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModelTest.kt +++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/viewmodel/ShareouselViewModelTest.kt @@ -79,12 +79,12 @@ class ShareouselViewModelTest { previewSelectionsRepository.selections.value = setOf( PreviewModel( - Uri.fromParts("scheme", "ssp", "fragment"), - null, + uri = Uri.fromParts("scheme", "ssp", "fragment"), + mimeType = null, ), PreviewModel( - Uri.fromParts("scheme1", "ssp1", "fragment1"), - null, + uri = Uri.fromParts("scheme1", "ssp1", "fragment1"), + mimeType = null, ) ) runCurrent() @@ -114,12 +114,12 @@ class ShareouselViewModelTest { previewModels = setOf( PreviewModel( - Uri.fromParts("scheme", "ssp", "fragment"), - null, + uri = Uri.fromParts("scheme", "ssp", "fragment"), + mimeType = null, ), PreviewModel( - Uri.fromParts("scheme1", "ssp1", "fragment1"), - null, + uri = Uri.fromParts("scheme1", "ssp1", "fragment1"), + mimeType = null, ) ), startIdx = 1, @@ -141,7 +141,10 @@ class ShareouselViewModelTest { val previewVm = shareouselViewModel.preview( - PreviewModel(Uri.fromParts("scheme1", "ssp1", "fragment1"), null) + PreviewModel( + uri = Uri.fromParts("scheme1", "ssp1", "fragment1"), + mimeType = null + ) ) assertWithMessage("preview bitmap is null").that(previewVm.bitmap.first()).isNotNull() @@ -205,7 +208,7 @@ class ShareouselViewModelTest { this.pendingIntentSender = pendingIntentSender this.targetIntentModifier = targetIntentModifier previewSelectionsRepository.selections.value = - setOf(PreviewModel(Uri.fromParts("scheme", "ssp", "fragment"), null)) + setOf(PreviewModel(uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = null)) payloadToggleImageLoader = FakeImageLoader( initialBitmaps = |