diff options
| author | 2024-04-12 19:22:07 +0000 | |
|---|---|---|
| committer | 2024-04-15 18:32:00 +0000 | |
| commit | dd541997aa8c9eff1b64f035afc1a7bb86b96517 (patch) | |
| tree | 184fc7cf59741d21a244e60e348b153fea1ad80c /java/src/com | |
| parent | fbd7a3c2a844969a8c578d20c55a39adb3f38bcc (diff) | |
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
Diffstat (limited to 'java/src/com')
3 files changed, 31 insertions, 1 deletions
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<TextView>(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<TextView>(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<List<CustomActionModel>> get() = repository.customActions.asSharedFlow() + + val metadataText: Flow<CharSequence?> + 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<String>, + /** App-provided text shown beneath the headline. */ + val metadataText: Flow<CharSequence?>, /** * 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 -> |