summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
Diffstat (limited to 'java/src')
-rw-r--r--java/src/com/android/intentresolver/ChooserActivity.java4
-rw-r--r--java/src/com/android/intentresolver/ChooserRequestParameters.java14
-rw-r--r--java/src/com/android/intentresolver/contentpreview/ChooserContentPreviewUi.java33
-rw-r--r--java/src/com/android/intentresolver/contentpreview/ContentPreviewUi.java13
-rw-r--r--java/src/com/android/intentresolver/contentpreview/FileContentPreviewUi.java8
-rw-r--r--java/src/com/android/intentresolver/contentpreview/FilesPlusTextContentPreviewUi.java7
-rw-r--r--java/src/com/android/intentresolver/contentpreview/TextContentPreviewUi.java5
-rw-r--r--java/src/com/android/intentresolver/contentpreview/UnifiedContentPreviewUi.java7
-rw-r--r--java/src/com/android/intentresolver/inject/FeatureFlagsModule.kt4
-rw-r--r--java/src/com/android/intentresolver/v2/ChooserActivity.java4
-rw-r--r--java/src/com/android/intentresolver/v2/ui/model/ChooserRequest.kt9
-rw-r--r--java/src/com/android/intentresolver/v2/ui/viewmodel/ChooserRequestReader.kt9
-rw-r--r--java/src/com/android/intentresolver/v2/ui/viewmodel/ChooserViewModel.kt8
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]) {