From dd541997aa8c9eff1b64f035afc1a7bb86b96517 Mon Sep 17 00:00:00 2001 From: Matt Casey Date: Fri, 12 Apr 2024 19:22:07 +0000 Subject: Add metadata text to shareousel UI Test: atest ShareouselViewModelTest Test: Manual testing with ShareTest (updating string on toggle) Bug: 325463573 Bug: 325462259 Flag: ACONFIG android.service.chooser.chooser_payload_toggling NEXTFOOD Change-Id: I73d2ee2ad37321a8ebf9e559e37427563c2e2ffa --- .../contentpreview/ShareouselContentPreviewUi.kt | 24 +++++++++++++++++++++- .../domain/interactor/ChooserRequestInteractor.kt | 3 +++ .../ui/viewmodel/ShareouselViewModel.kt | 5 +++++ 3 files changed, 31 insertions(+), 1 deletion(-) (limited to 'java/src/com') diff --git a/java/src/com/android/intentresolver/contentpreview/ShareouselContentPreviewUi.kt b/java/src/com/android/intentresolver/contentpreview/ShareouselContentPreviewUi.kt index fa0859e0..5fce711c 100644 --- a/java/src/com/android/intentresolver/contentpreview/ShareouselContentPreviewUi.kt +++ b/java/src/com/android/intentresolver/contentpreview/ShareouselContentPreviewUi.kt @@ -33,6 +33,8 @@ import com.android.intentresolver.R import com.android.intentresolver.contentpreview.payloadtoggle.ui.composable.Shareousel import com.android.intentresolver.contentpreview.payloadtoggle.ui.viewmodel.ShareouselViewModel import com.android.intentresolver.ui.viewmodel.ChooserViewModel +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.launch @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) class ShareouselContentPreviewUi : ContentPreviewUi() { @@ -56,7 +58,7 @@ class ShareouselContentPreviewUi : ContentPreviewUi() { val viewModel: ShareouselViewModel = vm.shareouselViewModel headlineViewParent?.let { - LaunchedEffect(viewModel) { bindHeadline(viewModel, headlineViewParent) } + LaunchedEffect(viewModel) { bindHeader(viewModel, headlineViewParent) } } MaterialTheme( @@ -73,6 +75,13 @@ class ShareouselContentPreviewUi : ContentPreviewUi() { } } + private suspend fun bindHeader(viewModel: ShareouselViewModel, headlineViewParent: View) { + coroutineScope { + launch { bindHeadline(viewModel, headlineViewParent) } + launch { bindMetadataText(viewModel, headlineViewParent) } + } + } + private suspend fun bindHeadline(viewModel: ShareouselViewModel, headlineViewParent: View) { viewModel.headline.collect { headline -> headlineViewParent.findViewById(R.id.headline)?.apply { @@ -85,4 +94,17 @@ class ShareouselContentPreviewUi : ContentPreviewUi() { } } } + + private suspend fun bindMetadataText(viewModel: ShareouselViewModel, headlineViewParent: View) { + viewModel.metadataText.collect { metadata -> + headlineViewParent.findViewById(R.id.metadata)?.apply { + if (metadata?.isNotBlank() == true) { + text = metadata + visibility = View.VISIBLE + } else { + visibility = View.GONE + } + } + } + } } diff --git a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/ChooserRequestInteractor.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/ChooserRequestInteractor.kt index c70fc83e..953e91b3 100644 --- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/ChooserRequestInteractor.kt +++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/domain/interactor/ChooserRequestInteractor.kt @@ -35,4 +35,7 @@ constructor( val customActions: Flow> get() = repository.customActions.asSharedFlow() + + val metadataText: Flow + get() = repository.chooserRequest.map { it.metadataText } } 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 6eccaffa..082581dc 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 @@ -21,6 +21,7 @@ import com.android.intentresolver.contentpreview.HeadlineGenerator import com.android.intentresolver.contentpreview.ImageLoader import com.android.intentresolver.contentpreview.ImagePreviewImageLoader import com.android.intentresolver.contentpreview.payloadtoggle.domain.cursor.PayloadToggle +import com.android.intentresolver.contentpreview.payloadtoggle.domain.interactor.ChooserRequestInteractor import com.android.intentresolver.contentpreview.payloadtoggle.domain.interactor.CustomActionsInteractor import com.android.intentresolver.contentpreview.payloadtoggle.domain.interactor.SelectablePreviewsInteractor import com.android.intentresolver.contentpreview.payloadtoggle.domain.interactor.SelectionInteractor @@ -47,6 +48,8 @@ import kotlinx.coroutines.plus data class ShareouselViewModel( /** Text displayed at the top of the share sheet when Shareousel is present. */ val headline: Flow, + /** App-provided text shown beneath the headline. */ + val metadataText: Flow, /** * Previews which are available for presentation within Shareousel. Use [preview] to create a * [ShareouselPreviewViewModel] for a given [PreviewModel]. @@ -68,6 +71,7 @@ object ShareouselViewModelModule { actionsInteractor: CustomActionsInteractor, headlineGenerator: HeadlineGenerator, selectionInteractor: SelectionInteractor, + chooserRequestInteractor: ChooserRequestInteractor, // TODO: remove if possible @ViewModelOwned scope: CoroutineScope, ): ShareouselViewModel { @@ -87,6 +91,7 @@ object ShareouselViewModelModule { ContentType.Video -> headlineGenerator.getVideosHeadline(numItems) } }, + metadataText = chooserRequestInteractor.metadataText, previews = keySet, actions = actionsInteractor.customActions.map { actions -> -- cgit v1.2.3-59-g8ed1b