diff options
14 files changed, 46 insertions, 47 deletions
diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/data/repository/PreviewSelectionsRepository.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/data/repository/PreviewSelectionsRepository.kt index 9aecc981..48c06192 100644 --- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/data/repository/PreviewSelectionsRepository.kt +++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/data/repository/PreviewSelectionsRepository.kt @@ -24,5 +24,5 @@ import kotlinx.coroutines.flow.MutableStateFlow /** Stores set of selected previews. */ @ViewModelScoped class PreviewSelectionsRepository @Inject constructor() { - val selections = MutableStateFlow(emptySet<PreviewModel>()) + val selections = MutableStateFlow(emptyList<PreviewModel>()) } 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 f02834e0..a0fc11c3 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 @@ -94,7 +94,7 @@ constructor( val startPageNum = state.firstLoadedPageNum while ((state.hasMoreLeft || state.hasMoreRight) && state.numLoadedPages < maxLoadedPages) { interactor.setPreviews( - previewsByKey = state.merged.values.toSet(), + previews = state.merged.values.toList(), startIndex = startPageNum, hasMoreLeft = state.hasMoreLeft, hasMoreRight = state.hasMoreRight, @@ -126,7 +126,7 @@ constructor( // those. val loadingState: Flow<LoadDirection?> = interactor.setPreviews( - previewsByKey = state.merged.values.toSet(), + previews = state.merged.values.toList(), startIndex = 0, // TODO: actually track this as the window changes? hasMoreLeft = state.hasMoreLeft, hasMoreRight = state.hasMoreRight, 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 80cd03d9..388cbc7e 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 @@ -44,10 +44,10 @@ constructor( ) { suspend fun activate() = coroutineScope { val cursor = async { cursorResolver.getCursor() } - val initialPreviewMap: Set<PreviewModel> = getInitialPreviews() + val initialPreviewMap = getInitialPreviews() selectionRepository.selections.value = initialPreviewMap setCursorPreviews.setPreviews( - previewsByKey = initialPreviewMap, + previews = initialPreviewMap, startIndex = focusedItemIdx, hasMoreLeft = false, hasMoreRight = false, @@ -55,7 +55,7 @@ constructor( cursorInteractor.launch(cursor.await() ?: return@coroutineScope, initialPreviewMap) } - private suspend fun getInitialPreviews(): Set<PreviewModel> = + private suspend fun getInitialPreviews(): List<PreviewModel> = selectedItems // Restrict parallelism so as to not overload the metadata reader; anecdotally, too // many parallel queries causes failures. @@ -72,5 +72,4 @@ constructor( ?: 1f, ) } - .toSet() } diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectionInteractor.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectionInteractor.kt index e99aa50c..13af92cb 100644 --- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectionInteractor.kt +++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectionInteractor.kt @@ -35,8 +35,8 @@ constructor( private val updateTargetIntentInteractor: UpdateTargetIntentInteractor, private val mimeTypeClassifier: MimeTypeClassifier, ) { - /** Set of selected previews. */ - val selections: StateFlow<Set<PreviewModel>> + /** List of selected previews. */ + val selections: StateFlow<List<PreviewModel>> get() = selectionsRepo.selections /** Amount of selected previews. */ @@ -54,13 +54,13 @@ constructor( } } - private fun updateChooserRequest(selections: Set<PreviewModel>) { + private fun updateChooserRequest(selections: List<PreviewModel>) { val intent = targetIntentModifier.intentFromSelection(selections) updateTargetIntentInteractor.updateTargetIntent(intent) } private fun aggregateContentType( - items: Set<PreviewModel>, + items: List<PreviewModel>, ): ContentType { if (items.isEmpty()) { return ContentType.Other diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SetCursorPreviewsInteractor.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SetCursorPreviewsInteractor.kt index 21a599fa..437bc942 100644 --- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SetCursorPreviewsInteractor.kt +++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SetCursorPreviewsInteractor.kt @@ -29,9 +29,9 @@ import kotlinx.coroutines.flow.asStateFlow class SetCursorPreviewsInteractor @Inject constructor(private val previewsRepo: CursorPreviewsRepository) { - /** Stores new [previewsByKey], and returns a flow of load requests triggered by Shareousel. */ + /** Stores new [previews], and returns a flow of load requests triggered by Shareousel. */ fun setPreviews( - previewsByKey: Set<PreviewModel>, + previews: List<PreviewModel>, startIndex: Int, hasMoreLeft: Boolean, hasMoreRight: Boolean, @@ -39,7 +39,7 @@ constructor(private val previewsRepo: CursorPreviewsRepository) { val loadingState = MutableStateFlow<LoadDirection?>(null) previewsRepo.previewsModel.value = PreviewsModel( - previewModels = previewsByKey, + previewModels = previews, startIdx = startIndex, loadMoreLeft = if (hasMoreLeft) { diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewsModel.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewsModel.kt index 0ac99bd3..1d3eb4b4 100644 --- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewsModel.kt +++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/shared/model/PreviewsModel.kt @@ -19,7 +19,7 @@ package com.android.intentresolver.contentpreview.payloadtoggle.shared.model /** A dataset of previews for Shareousel. */ data class PreviewsModel( /** All available [PreviewModel]s. */ - val previewModels: Set<PreviewModel>, + val previewModels: List<PreviewModel>, /** Index into [previewModels] that should be initially displayed to the user. */ val startIdx: Int, /** diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt index c25b0154..02d997ae 100644 --- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt +++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ShareouselComposable.kt @@ -30,7 +30,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyRow -import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.selection.toggleable @@ -104,8 +103,8 @@ private fun PreviewCarousel( .height(dimensionResource(R.dimen.chooser_preview_image_height_tall)) .systemGestureExclusion() ) { - items(previews.previewModels.toList(), key = { it.uri }) { model -> - ShareouselCard(viewModel.preview(model)) + itemsIndexed(previews.previewModels, key = { _, model -> model.uri }) { index, model -> + ShareouselCard(viewModel.preview(index, model)) } } } 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 4eda3fa9..9d53b92a 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 @@ -55,7 +55,7 @@ data class ShareouselViewModel( /** List of action chips presented underneath Shareousel. */ val actions: Flow<List<ActionChipViewModel>>, /** Creates a [ShareouselPreviewViewModel] for a [PreviewModel] present in [previews]. */ - val preview: (key: PreviewModel) -> ShareouselPreviewViewModel, + val preview: (index: Int, key: PreviewModel) -> ShareouselPreviewViewModel, ) @Module @@ -112,8 +112,8 @@ interface ShareouselViewModelModule { } } }, - preview = { key -> - keySet.value?.maybeLoad(key) + preview = { index, key -> + keySet.value?.maybeLoad(index) val previewInteractor = interactor.preview(key) val contentType = when { @@ -134,9 +134,9 @@ interface ShareouselViewModelModule { } } -private fun PreviewsModel.maybeLoad(key: PreviewModel) { - when (key) { - previewModels.firstOrNull() -> loadMoreLeft?.invoke() - previewModels.lastOrNull() -> loadMoreRight?.invoke() +private fun PreviewsModel.maybeLoad(index: Int) { + when (index) { + previewModels.indices.firstOrNull() -> loadMoreLeft?.invoke() + previewModels.indices.lastOrNull() -> loadMoreRight?.invoke() } } 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 146892d0..0009c7af 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 @@ -113,7 +113,7 @@ class FetchPreviewsInteractorTest { .isEqualTo( PreviewsModel( previewModels = - setOf( + listOf( PreviewModel( uri = Uri.fromParts("scheme1", "ssp1", "fragment1"), mimeType = "image/bitmap", 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 a3c65570..0275a9c3 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 @@ -64,7 +64,7 @@ class SelectablePreviewInteractorTest { assertThat(underTest.isSelected.first()).isFalse() previewSelectionsRepository.selections.value = - setOf( + listOf( PreviewModel( uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = "image/bitmap" 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 be5ddfe5..b6c212b7 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 @@ -39,7 +39,7 @@ class SelectablePreviewsInteractorTest { cursorPreviewsRepository.previewsModel.value = PreviewsModel( previewModels = - setOf( + listOf( PreviewModel( uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = "image/bitmap", @@ -54,7 +54,7 @@ class SelectablePreviewsInteractorTest { loadMoreRight = null, ) previewSelectionsRepository.selections.value = - setOf( + listOf( PreviewModel(uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = null), ) targetIntentModifier = TargetIntentModifier { error("unexpected invocation") } @@ -94,7 +94,7 @@ class SelectablePreviewsInteractorTest { @Test fun keySet_reflectsRepositoryUpdate() = runKosmosTest { previewSelectionsRepository.selections.value = - setOf( + listOf( PreviewModel(uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = null), ) targetIntentModifier = TargetIntentModifier { error("unexpected invocation") } @@ -114,7 +114,7 @@ class SelectablePreviewsInteractorTest { cursorPreviewsRepository.previewsModel.value = PreviewsModel( previewModels = - setOf( + listOf( PreviewModel( uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = "image/bitmap", @@ -128,7 +128,7 @@ class SelectablePreviewsInteractorTest { loadMoreLeft = null, loadMoreRight = { loadRequested = true }, ) - previewSelectionsRepository.selections.value = emptySet() + previewSelectionsRepository.selections.value = emptyList() runCurrent() assertThat(previews.value).isNotNull() diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectionInteractorTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectionInteractorTest.kt index 708e6cc6..a50efebf 100644 --- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectionInteractorTest.kt +++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SelectionInteractorTest.kt @@ -30,7 +30,7 @@ class SelectionInteractorTest { fun singleSelection_removalPrevented() = runKosmosTest { val initialPreview = PreviewModel(uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = null) - previewSelectionsRepository.selections.value = setOf(initialPreview) + previewSelectionsRepository.selections.value = listOf(initialPreview) val underTest = SelectionInteractor( @@ -40,12 +40,12 @@ class SelectionInteractorTest { mimetypeClassifier, ) - assertThat(underTest.selections.value).isEqualTo(setOf(initialPreview)) + assertThat(underTest.selections.value).containsExactly(initialPreview) // Shouldn't do anything! underTest.unselect(initialPreview) - assertThat(underTest.selections.value).isEqualTo(setOf(initialPreview)) + assertThat(underTest.selections.value).containsExactly(initialPreview) } @Test @@ -53,7 +53,7 @@ class SelectionInteractorTest { val first = PreviewModel(uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = null) val second = PreviewModel(uri = Uri.fromParts("scheme2", "ssp2", "fragment2"), mimeType = null) - previewSelectionsRepository.selections.value = setOf(first, second) + previewSelectionsRepository.selections.value = listOf(first, second) val underTest = SelectionInteractor( @@ -65,6 +65,6 @@ class SelectionInteractorTest { underTest.unselect(first) - assertThat(underTest.selections.value).isEqualTo(setOf(second)) + assertThat(underTest.selections.value).containsExactly(second) } } diff --git a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SetCursorPreviewsInteractorTest.kt b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SetCursorPreviewsInteractorTest.kt index 5aac7b55..0708dbbb 100644 --- a/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SetCursorPreviewsInteractorTest.kt +++ b/tests/unit/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/SetCursorPreviewsInteractorTest.kt @@ -34,8 +34,8 @@ class SetCursorPreviewsInteractorTest { fun setPreviews_noAdditionalData() = runKosmosTest { val loadState = setCursorPreviewsInteractor.setPreviews( - previewsByKey = - setOf( + previews = + listOf( PreviewModel( uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = null, @@ -69,8 +69,8 @@ class SetCursorPreviewsInteractorTest { val loadState = setCursorPreviewsInteractor .setPreviews( - previewsByKey = - setOf( + previews = + listOf( PreviewModel( uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = null, 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 fb3e9a3f..5884d178 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 @@ -80,7 +80,7 @@ class ShareouselViewModelTest { fun headline_images() = runTest { assertThat(shareouselViewModel.headline.first()).isEqualTo("FILES: 1") previewSelectionsRepository.selections.value = - setOf( + listOf( PreviewModel( uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = "image/png", @@ -97,7 +97,7 @@ class ShareouselViewModelTest { @Test fun headline_videos() = runTest { previewSelectionsRepository.selections.value = - setOf( + listOf( PreviewModel( uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = "video/mpeg", @@ -114,7 +114,7 @@ class ShareouselViewModelTest { @Test fun headline_mixed() = runTest { previewSelectionsRepository.selections.value = - setOf( + listOf( PreviewModel( uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = "image/jpeg", @@ -149,7 +149,7 @@ class ShareouselViewModelTest { cursorPreviewsRepository.previewsModel.value = PreviewsModel( previewModels = - setOf( + listOf( PreviewModel( uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = "image/png", @@ -177,7 +177,8 @@ class ShareouselViewModelTest { .inOrder() val previewVm = - shareouselViewModel.preview( + shareouselViewModel.preview.invoke( + /* index = */ 1, PreviewModel( uri = Uri.fromParts("scheme1", "ssp1", "fragment1"), mimeType = "video/mpeg" @@ -246,7 +247,7 @@ class ShareouselViewModelTest { this.pendingIntentSender = pendingIntentSender this.targetIntentModifier = targetIntentModifier previewSelectionsRepository.selections.value = - setOf(PreviewModel(uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = null)) + listOf(PreviewModel(uri = Uri.fromParts("scheme", "ssp", "fragment"), mimeType = null)) payloadToggleImageLoader = FakeImageLoader( initialBitmaps = |