diff options
| author | 2024-02-12 19:37:39 +0000 | |
|---|---|---|
| committer | 2024-02-12 19:37:39 +0000 | |
| commit | 452240b2fa39855b059c3fe084362fd5b9d07ee1 (patch) | |
| tree | 3d552ae2d1466f182eea72c88dab71ac3c378429 /java/src | |
| parent | dda6a6a23f64a91a06f792c878cf3639b212b2d9 (diff) | |
| parent | ee302948e469578bd7866dd709d7a2136b360648 (diff) | |
Merge "Makes default sharesheet show metadata text below title" into main
Diffstat (limited to 'java/src')
13 files changed, 108 insertions, 17 deletions
diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java index 708538de..843ae809 100644 --- a/java/src/com/android/intentresolver/ChooserActivity.java +++ b/java/src/com/android/intentresolver/ChooserActivity.java @@ -311,7 +311,9 @@ public class ChooserActivity extends Hilt_ChooserActivity implements createChooserActionFactory(), mEnterTransitionAnimationDelegate, new HeadlineGeneratorImpl(this), - ContentTypeHint.NONE); + ContentTypeHint.NONE, + mChooserRequest.getMetadataText() + ); updateStickyContentPreview(); if (shouldShowStickyContentPreview() diff --git a/java/src/com/android/intentresolver/ChooserRequestParameters.java b/java/src/com/android/intentresolver/ChooserRequestParameters.java index 7ad809e9..968aee2e 100644 --- a/java/src/com/android/intentresolver/ChooserRequestParameters.java +++ b/java/src/com/android/intentresolver/ChooserRequestParameters.java @@ -101,6 +101,9 @@ public class ChooserRequestParameters { @Nullable private final IntentFilter mTargetIntentFilter; + @Nullable + private final CharSequence mMetadataText; + public ChooserRequestParameters( final Intent clientIntent, String referrerPackageName, @@ -147,6 +150,12 @@ public class ChooserRequestParameters { mChooserActions = getChooserActions(clientIntent); mModifyShareAction = getModifyShareAction(clientIntent); + + if (android.service.chooser.Flags.enableSharesheetMetadataExtra()) { + mMetadataText = clientIntent.getCharSequenceExtra(Intent.EXTRA_METADATA_TEXT); + } else { + mMetadataText = null; + } } public Intent getTargetIntent() { @@ -252,6 +261,11 @@ public class ChooserRequestParameters { return mTargetIntentFilter; } + @Nullable + public CharSequence getMetadataText() { + return mMetadataText; + } + private static boolean isSendAction(@Nullable String action) { return (Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)); } diff --git a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java index 5b4cb682..471a33e6 100644 --- a/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java @@ -100,7 +100,8 @@ public final class ChooserContentPreviewUi { ActionFactory actionFactory, TransitionElementStatusCallback transitionElementStatusCallback, HeadlineGenerator headlineGenerator, - ContentTypeHint contentTypeHint) { + ContentTypeHint contentTypeHint, + @Nullable CharSequence metadata) { mScope = scope; mContentPreviewUi = createContentPreview( previewData, @@ -110,7 +111,9 @@ public final class ChooserContentPreviewUi { actionFactory, transitionElementStatusCallback, headlineGenerator, - contentTypeHint); + contentTypeHint, + metadata + ); if (mContentPreviewUi.getType() != CONTENT_PREVIEW_IMAGE) { transitionElementStatusCallback.onAllTransitionElementsReady(); } @@ -124,8 +127,9 @@ public final class ChooserContentPreviewUi { ActionFactory actionFactory, TransitionElementStatusCallback transitionElementStatusCallback, HeadlineGenerator headlineGenerator, - ContentTypeHint contentTypeHint) { - + ContentTypeHint contentTypeHint, + @Nullable CharSequence metadata + ) { int previewType = previewData.getPreviewType(); if (previewType == CONTENT_PREVIEW_TEXT) { return createTextPreview( @@ -134,13 +138,17 @@ public final class ChooserContentPreviewUi { actionFactory, imageLoader, headlineGenerator, - contentTypeHint); + contentTypeHint, + metadata + ); } if (previewType == CONTENT_PREVIEW_FILE) { FileContentPreviewUi fileContentPreviewUi = new FileContentPreviewUi( previewData.getUriCount(), actionFactory, - headlineGenerator); + headlineGenerator, + metadata + ); if (previewData.getUriCount() > 0) { previewData.getFirstFileName(mScope, fileContentPreviewUi::setFirstFileName); } @@ -160,7 +168,9 @@ public final class ChooserContentPreviewUi { actionFactory, imageLoader, typeClassifier, - headlineGenerator); + headlineGenerator, + metadata + ); if (previewData.getUriCount() > 0) { JavaFlowHelper.collectToList( mScope, @@ -180,7 +190,9 @@ public final class ChooserContentPreviewUi { transitionElementStatusCallback, previewData.getImagePreviewFileInfoFlow(), previewData.getUriCount(), - headlineGenerator); + headlineGenerator, + metadata + ); } public int getPreferredContentPreview() { @@ -206,7 +218,9 @@ public final class ChooserContentPreviewUi { ChooserContentPreviewUi.ActionFactory actionFactory, ImageLoader imageLoader, HeadlineGenerator headlineGenerator, - ContentTypeHint contentTypeHint) { + ContentTypeHint contentTypeHint, + @Nullable CharSequence metadata + ) { CharSequence sharingText = targetIntent.getCharSequenceExtra(Intent.EXTRA_TEXT); CharSequence previewTitle = targetIntent.getCharSequenceExtra(Intent.EXTRA_TITLE); ClipData previewData = targetIntent.getClipData(); @@ -222,6 +236,7 @@ public final class ChooserContentPreviewUi { scope, sharingText, previewTitle, + metadata, previewThumbnail, actionFactory, imageLoader, diff --git a/java/src/com/android/intentresolver/contentpreview/ContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/ContentPreviewUi.java index dce146b0..c35f93b4 100644 --- a/java/src/com/android/intentresolver/contentpreview/ContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/ContentPreviewUi.java @@ -83,6 +83,19 @@ abstract class ContentPreviewUi { } } + protected static void displayMetadata(View layout, @Nullable CharSequence metadata) { + TextView metadataView = layout == null ? null : layout.findViewById(R.id.metadata); + if (metadataView == null) { + return; + } + if (!TextUtils.isEmpty(metadata)) { + metadataView.setText(metadata); + metadataView.setVisibility(View.VISIBLE); + } else { + metadataView.setVisibility(View.GONE); + } + } + protected static void displayModifyShareAction( View layout, ChooserContentPreviewUi.ActionFactory actionFactory) { ActionRow.Action modifyShareAction = actionFactory.getModifyShareAction(); diff --git a/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java index 89e7e528..d4eea8b9 100644 --- a/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java @@ -43,15 +43,20 @@ class FileContentPreviewUi extends ContentPreviewUi { private final ChooserContentPreviewUi.ActionFactory mActionFactory; private final HeadlineGenerator mHeadlineGenerator; @Nullable + private final CharSequence mMetadata; + @Nullable private ViewGroup mContentPreview = null; FileContentPreviewUi( int fileCount, ChooserContentPreviewUi.ActionFactory actionFactory, - HeadlineGenerator headlineGenerator) { + HeadlineGenerator headlineGenerator, + @Nullable CharSequence metadata + ) { mFileCount = fileCount; mActionFactory = actionFactory; mHeadlineGenerator = headlineGenerator; + mMetadata = metadata; } @Override @@ -91,6 +96,7 @@ class FileContentPreviewUi extends ContentPreviewUi { inflateHeadline(headlineViewParent); displayHeadline(headlineViewParent, mHeadlineGenerator.getFilesHeadline(mFileCount)); + displayMetadata(headlineViewParent, mMetadata); if (mFileCount == 0) { mContentPreview.setVisibility(View.GONE); diff --git a/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java index 78fc6586..6832c5c4 100644 --- a/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java @@ -57,6 +57,8 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi { private final ImageLoader mImageLoader; private final MimeTypeClassifier mTypeClassifier; private final HeadlineGenerator mHeadlineGenerator; + @Nullable + private final CharSequence mMetadata; private final boolean mIsSingleImage; private final int mFileCount; private ViewGroup mContentPreviewView; @@ -78,7 +80,8 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi { ChooserContentPreviewUi.ActionFactory actionFactory, ImageLoader imageLoader, MimeTypeClassifier typeClassifier, - HeadlineGenerator headlineGenerator) { + HeadlineGenerator headlineGenerator, + @Nullable CharSequence metadata) { if (isSingleImage && fileCount != 1) { throw new IllegalArgumentException( "fileCount = " + fileCount + " and isSingleImage = true"); @@ -92,6 +95,7 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi { mImageLoader = imageLoader; mTypeClassifier = typeClassifier; mHeadlineGenerator = headlineGenerator; + mMetadata = metadata; } @Override @@ -204,6 +208,7 @@ class FilesPlusTextContentPreviewUi extends ContentPreviewUi { } displayHeadline(headlineView, headline); + displayMetadata(headlineView, mMetadata); } private void prepareTextPreview( diff --git a/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java index df2896d7..fbdc5853 100644 --- a/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java @@ -43,6 +43,8 @@ class TextContentPreviewUi extends ContentPreviewUi { @Nullable private final CharSequence mPreviewTitle; @Nullable + private final CharSequence mMetadata; + @Nullable private final Uri mPreviewThumbnail; private final ImageLoader mImageLoader; private final ChooserContentPreviewUi.ActionFactory mActionFactory; @@ -53,6 +55,7 @@ class TextContentPreviewUi extends ContentPreviewUi { CoroutineScope scope, @Nullable CharSequence sharingText, @Nullable CharSequence previewTitle, + @Nullable CharSequence metadata, @Nullable Uri previewThumbnail, ChooserContentPreviewUi.ActionFactory actionFactory, ImageLoader imageLoader, @@ -61,6 +64,7 @@ class TextContentPreviewUi extends ContentPreviewUi { mScope = scope; mSharingText = sharingText; mPreviewTitle = previewTitle; + mMetadata = metadata; mPreviewThumbnail = previewThumbnail; mImageLoader = imageLoader; mActionFactory = actionFactory; @@ -147,6 +151,7 @@ class TextContentPreviewUi extends ContentPreviewUi { ? mHeadlineGenerator.getAlbumHeadline() : mHeadlineGenerator.getTextHeadline(mSharingText); displayHeadline(headlineViewParent, headlineText); + displayMetadata(headlineViewParent, mMetadata); return contentPreviewLayout; } diff --git a/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java b/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java index 8ddd5273..0974c79b 100644 --- a/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java +++ b/java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java @@ -46,6 +46,8 @@ class UnifiedContentPreviewUi extends ContentPreviewUi { private final MimeTypeClassifier mTypeClassifier; private final TransitionElementStatusCallback mTransitionElementStatusCallback; private final HeadlineGenerator mHeadlineGenerator; + @Nullable + private final CharSequence mMetadata; private final Flow<FileInfo> mFileInfoFlow; private final int mItemCount; @Nullable @@ -65,7 +67,8 @@ class UnifiedContentPreviewUi extends ContentPreviewUi { TransitionElementStatusCallback transitionElementStatusCallback, Flow<FileInfo> fileInfoFlow, int itemCount, - HeadlineGenerator headlineGenerator) { + HeadlineGenerator headlineGenerator, + @Nullable CharSequence metadata) { mShowEditAction = isSingleImage; mIntentMimeType = intentMimeType; mActionFactory = actionFactory; @@ -75,6 +78,7 @@ class UnifiedContentPreviewUi extends ContentPreviewUi { mFileInfoFlow = fileInfoFlow; mItemCount = itemCount; mHeadlineGenerator = headlineGenerator; + mMetadata = metadata; JavaFlowHelper.collectToList(scope, fileInfoFlow, this::setFiles); } @@ -181,5 +185,6 @@ class UnifiedContentPreviewUi extends ContentPreviewUi { } else { displayHeadline(layout, mHeadlineGenerator.getFilesHeadline(count)); } + displayMetadata(layout, mMetadata); } } diff --git a/java/src/com/android/intentresolver/inject/FeatureFlagsModule.kt b/java/src/com/android/intentresolver/inject/FeatureFlagsModule.kt index 67186371..0f9a18c1 100644 --- a/java/src/com/android/intentresolver/inject/FeatureFlagsModule.kt +++ b/java/src/com/android/intentresolver/inject/FeatureFlagsModule.kt @@ -9,8 +9,12 @@ import dagger.hilt.components.SingletonComponent typealias IntentResolverFlags = com.android.intentresolver.FeatureFlags +typealias FakeIntentResolverFlags = com.android.intentresolver.FakeFeatureFlagsImpl + typealias ChooserServiceFlags = android.service.chooser.FeatureFlags +typealias FakeChooserServiceFlags = android.service.chooser.FakeFeatureFlagsImpl + @Module @InstallIn(SingletonComponent::class) object FeatureFlagsModule { diff --git a/java/src/com/android/intentresolver/v2/ChooserActivity.java b/java/src/com/android/intentresolver/v2/ChooserActivity.java index 247f6529..35812071 100644 --- a/java/src/com/android/intentresolver/v2/ChooserActivity.java +++ b/java/src/com/android/intentresolver/v2/ChooserActivity.java @@ -478,7 +478,9 @@ public class ChooserActivity extends Hilt_ChooserActivity implements createChooserActionFactory(), mEnterTransitionAnimationDelegate, new HeadlineGeneratorImpl(this), - chooserRequest.getContentTypeHint()); + chooserRequest.getContentTypeHint(), + chooserRequest.getMetadataText() + ); updateStickyContentPreview(); if (shouldShowStickyContentPreview() || mChooserMultiProfilePagerAdapter diff --git a/java/src/com/android/intentresolver/v2/ui/model/ChooserRequest.kt b/java/src/com/android/intentresolver/v2/ui/model/ChooserRequest.kt index 4fc2e46a..4f3cf3cd 100644 --- a/java/src/com/android/intentresolver/v2/ui/model/ChooserRequest.kt +++ b/java/src/com/android/intentresolver/v2/ui/model/ChooserRequest.kt @@ -172,7 +172,14 @@ data class ChooserRequest( val focusedItemPosition: Int = 0, /** Value for [Intent.EXTRA_CHOOSER_CONTENT_TYPE_HINT] on the incoming chooser intent. */ - val contentTypeHint: ContentTypeHint = ContentTypeHint.NONE + val contentTypeHint: ContentTypeHint = ContentTypeHint.NONE, + + /** + * Metadata to be shown to the user as a part of the sharesheet window. + * + * Specified by the [Intent.EXTRA_METADATA_TEXT] + */ + val metadataText: CharSequence? = null, ) { val referrerPackage = referrer?.takeIf { it.scheme == ANDROID_APP_SCHEME }?.authority diff --git a/java/src/com/android/intentresolver/v2/ui/viewmodel/ChooserRequestReader.kt b/java/src/com/android/intentresolver/v2/ui/viewmodel/ChooserRequestReader.kt index 558e54c9..cb1ef1ae 100644 --- a/java/src/com/android/intentresolver/v2/ui/viewmodel/ChooserRequestReader.kt +++ b/java/src/com/android/intentresolver/v2/ui/viewmodel/ChooserRequestReader.kt @@ -28,6 +28,7 @@ import android.content.Intent.EXTRA_CHOSEN_COMPONENT_INTENT_SENDER import android.content.Intent.EXTRA_EXCLUDE_COMPONENTS import android.content.Intent.EXTRA_INITIAL_INTENTS import android.content.Intent.EXTRA_INTENT +import android.content.Intent.EXTRA_METADATA_TEXT import android.content.Intent.EXTRA_REFERRER import android.content.Intent.EXTRA_REPLACEMENT_EXTRAS import android.content.Intent.EXTRA_TEXT @@ -157,6 +158,13 @@ fun readChooserRequest( ContentTypeHint.NONE } + val metadataText = + if (flags.enableSharesheetMetadataExtra()) { + optional(value<CharSequence>(EXTRA_METADATA_TEXT)) + } else { + null + } + ChooserRequest( targetIntent = targetIntent, targetAction = targetIntent.action, @@ -184,6 +192,7 @@ fun readChooserRequest( additionalContentUri = additionalContentUri, focusedItemPosition = focusedItemPos, contentTypeHint = contentTypeHint, + metadataText = metadataText, ) } } diff --git a/java/src/com/android/intentresolver/v2/ui/viewmodel/ChooserViewModel.kt b/java/src/com/android/intentresolver/v2/ui/viewmodel/ChooserViewModel.kt index 776bc1cb..a03f3769 100644 --- a/java/src/com/android/intentresolver/v2/ui/viewmodel/ChooserViewModel.kt +++ b/java/src/com/android/intentresolver/v2/ui/viewmodel/ChooserViewModel.kt @@ -29,8 +29,12 @@ import javax.inject.Inject private const val TAG = "ChooserViewModel" @HiltViewModel -class ChooserViewModel @Inject constructor(args: SavedStateHandle, flags: ChooserServiceFlags) : - ViewModel() { +class ChooserViewModel +@Inject +constructor( + args: SavedStateHandle, + flags: ChooserServiceFlags, +) : ViewModel() { private val mActivityLaunch: ActivityLaunch = requireNotNull(args[ACTIVITY_LAUNCH_KEY]) { |