diff options
Diffstat (limited to 'java')
11 files changed, 76 insertions, 14 deletions
diff --git a/java/res/layout/chooser_headline_row.xml b/java/res/layout/chooser_headline_row.xml index 97e8552e..bfce7473 100644 --- a/java/res/layout/chooser_headline_row.xml +++ b/java/res/layout/chooser_headline_row.xml @@ -65,13 +65,17 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:maxWidth="@dimen/modify_share_text_toggle_max_width" + android:background="@drawable/chooser_action_button_bg" app:layout_constraintEnd_toEndOf="parent" android:maxLines="2" android:ellipsize="end" android:visibility="gone" - android:paddingTop="3dp" - style="@style/TextAppearance.ChooserDefault" + android:paddingVertical="3dp" + android:paddingHorizontal="@dimen/chooser_edge_margin_normal_half" + style="?android:attr/borderlessButtonStyle" android:drawableEnd="@drawable/chevron_right" + android:textColor="?androidprv:attr/materialColorOnSurface" + android:textSize="12sp" /> <!-- This is only relevant for image+text preview, but needs to be in this layout so it can diff --git a/java/res/values-ar/strings.xml b/java/res/values-ar/strings.xml index a5979327..3b27b005 100644 --- a/java/res/values-ar/strings.xml +++ b/java/res/values-ar/strings.xml @@ -49,7 +49,7 @@ <string name="forward_intent_to_work" msgid="2906094223089139419">"أنت تستخدم هذا التطبيق في ملفك الشخصي للعمل"</string> <string name="activity_resolver_use_always" msgid="8674194687637555245">"دائمًا"</string> <string name="activity_resolver_use_once" msgid="594173435998892989">"مرة واحدة فقط"</string> - <string name="activity_resolver_work_profiles_support" msgid="8228711455685203580">"لا يتوافق تطبيق \"<xliff:g id="APP">%1$s</xliff:g>\" مع الملف الشخصي للعمل."</string> + <string name="activity_resolver_work_profiles_support" msgid="8228711455685203580">"لا يتوافق تطبيق \"<xliff:g id="APP">%1$s</xliff:g>\" مع ملف العمل."</string> <string name="pin_specific_target" msgid="5057063421361441406">"تثبيت <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="unpin_specific_target" msgid="3115158908159857777">"إزالة تثبيت <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="screenshot_edit" msgid="3857183660047569146">"تعديل"</string> diff --git a/java/res/values-in/strings.xml b/java/res/values-in/strings.xml index 83d18123..40313afa 100644 --- a/java/res/values-in/strings.xml +++ b/java/res/values-in/strings.xml @@ -55,7 +55,7 @@ <string name="screenshot_edit" msgid="3857183660047569146">"Edit"</string> <string name="other_files" msgid="4501185823517473875">"{count,plural, =1{+ # file}other{+ # file}}"</string> <string name="more_files" msgid="1043875756612339842">"{count,plural, =1{+ # file lainnya}other{+ # file lainnya}}"</string> - <string name="sharing_text" msgid="8137537443603304062">"Berbagi teks"</string> + <string name="sharing_text" msgid="8137537443603304062">"Teks yang akan dibagikan"</string> <string name="sharing_link" msgid="2307694372813942916">"Berbagi link"</string> <string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Berbagi gambar}other{Berbagi # gambar}}"</string> <string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Membagikan video}other{Membagikan # video}}"</string> diff --git a/java/res/values-nb/strings.xml b/java/res/values-nb/strings.xml index 587233b4..ef522229 100644 --- a/java/res/values-nb/strings.xml +++ b/java/res/values-nb/strings.xml @@ -55,7 +55,7 @@ <string name="screenshot_edit" msgid="3857183660047569146">"Endre"</string> <string name="other_files" msgid="4501185823517473875">"{count,plural, =1{+ # fil}other{+ # filer}}"</string> <string name="more_files" msgid="1043875756612339842">"{count,plural, =1{+ # fil til}other{+ # filer til}}"</string> - <string name="sharing_text" msgid="8137537443603304062">"Deler teksten"</string> + <string name="sharing_text" msgid="8137537443603304062">"Deler tekst"</string> <string name="sharing_link" msgid="2307694372813942916">"Deler linken"</string> <string name="sharing_images" msgid="5251443722186962006">"{count,plural, =1{Deler bildet}other{Deler # bilder}}"</string> <string name="sharing_videos" msgid="3583423190182877434">"{count,plural, =1{Deler videoen}other{Deler # videoer}}"</string> diff --git a/java/res/values-pt-rBR/strings.xml b/java/res/values-pt-rBR/strings.xml index 255fcbe6..575bc5da 100644 --- a/java/res/values-pt-rBR/strings.xml +++ b/java/res/values-pt-rBR/strings.xml @@ -77,7 +77,7 @@ <string name="usb_device_resolve_prompt_warn" msgid="4254493957548169620">"Este app não tem permissão de gravação, mas pode capturar áudio pelo dispositivo USB."</string> <string name="resolver_personal_tab" msgid="1381052735324320565">"Pessoal"</string> <string name="resolver_work_tab" msgid="3588325717455216412">"Trabalho"</string> - <string name="resolver_private_tab" msgid="3707548826254095157">"Particular"</string> + <string name="resolver_private_tab" msgid="3707548826254095157">"Privado"</string> <string name="resolver_personal_tab_accessibility" msgid="4467784352232582574">"Visualização pessoal"</string> <string name="resolver_work_tab_accessibility" msgid="7581878836587799920">"Visualização de trabalho"</string> <string name="resolver_private_tab_accessibility" msgid="2513122834337197252">"Visualização particular"</string> diff --git a/java/res/values-pt/strings.xml b/java/res/values-pt/strings.xml index 255fcbe6..575bc5da 100644 --- a/java/res/values-pt/strings.xml +++ b/java/res/values-pt/strings.xml @@ -77,7 +77,7 @@ <string name="usb_device_resolve_prompt_warn" msgid="4254493957548169620">"Este app não tem permissão de gravação, mas pode capturar áudio pelo dispositivo USB."</string> <string name="resolver_personal_tab" msgid="1381052735324320565">"Pessoal"</string> <string name="resolver_work_tab" msgid="3588325717455216412">"Trabalho"</string> - <string name="resolver_private_tab" msgid="3707548826254095157">"Particular"</string> + <string name="resolver_private_tab" msgid="3707548826254095157">"Privado"</string> <string name="resolver_personal_tab_accessibility" msgid="4467784352232582574">"Visualização pessoal"</string> <string name="resolver_work_tab_accessibility" msgid="7581878836587799920">"Visualização de trabalho"</string> <string name="resolver_private_tab_accessibility" msgid="2513122834337197252">"Visualização particular"</string> 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/composable/ComposeIconComposable.kt b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ComposeIconComposable.kt index 38138225..8cf237da 100644 --- a/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ComposeIconComposable.kt +++ b/java/src/com/android/intentresolver/contentpreview/payloadtoggle/ui/composable/ComposeIconComposable.kt @@ -22,6 +22,7 @@ import androidx.compose.foundation.Image import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource @@ -31,11 +32,16 @@ import com.android.intentresolver.icon.ComposeIcon import com.android.intentresolver.icon.ResourceIcon @Composable -fun Image(icon: ComposeIcon, modifier: Modifier = Modifier) { +fun Image(icon: ComposeIcon, modifier: Modifier = Modifier, colorFilter: ColorFilter? = null) { when (icon) { - is AdaptiveIcon -> Image(icon.wrapped, modifier) + is AdaptiveIcon -> Image(icon.wrapped, modifier, colorFilter = colorFilter) is BitmapIcon -> - Image(icon.bitmap.asImageBitmap(), contentDescription = null, modifier = modifier) + Image( + icon.bitmap.asImageBitmap(), + contentDescription = null, + modifier = modifier, + colorFilter = colorFilter + ) is ResourceIcon -> { val localContext = LocalContext.current val wrappedContext: Context = @@ -43,7 +49,12 @@ fun Image(icon: ComposeIcon, modifier: Modifier = Modifier) { override fun getResources(): Resources = icon.res } CompositionLocalProvider(LocalContext provides wrappedContext) { - Image(painterResource(icon.resId), contentDescription = null, modifier = modifier) + Image( + painterResource(icon.resId), + contentDescription = null, + modifier = modifier, + colorFilter = colorFilter + ) } } } 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 7558d994..0cb7306d 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 @@ -36,6 +36,8 @@ import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.AssistChip +import androidx.compose.material3.AssistChipDefaults +import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -44,6 +46,7 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.layout.ContentScale @@ -167,7 +170,13 @@ private fun ActionCarousel(viewModel: ShareouselViewModel) { label = actionViewModel.label, onClick = { actionViewModel.onClicked() }, ) { - actionViewModel.icon?.let { Image(icon = it, modifier = Modifier.size(16.dp)) } + actionViewModel.icon?.let { + Image( + icon = it, + modifier = Modifier.size(16.dp), + colorFilter = ColorFilter.tint(LocalContentColor.current) + ) + } } if (idx == actions.size - 1) { Spacer(Modifier.width(dimensionResource(R.dimen.chooser_edge_margin_normal))) @@ -188,7 +197,15 @@ private fun ShareouselAction( onClick = onClick, label = { Text(label) }, leadingIcon = leadingIcon, - modifier = modifier + border = null, + shape = RoundedCornerShape(1000.dp), // pill shape. + colors = + AssistChipDefaults.assistChipColors( + containerColor = MaterialTheme.colorScheme.surfaceContainerHigh, + labelColor = MaterialTheme.colorScheme.onSurface, + leadingIconContentColor = MaterialTheme.colorScheme.onSurface + ), + modifier = modifier, ) } 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 -> |