Commit fdcdc521 authored by Gayane Petrosyan's avatar Gayane Petrosyan Committed by Commit Bot

[Sh-Clank] Added HIGHLIGHTED_TEXT content type

Bug: 1102382
Change-Id: I7a4bcfdf6ed30a3ff458f8b4c8e022a7daa2aa6f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2311678
Commit-Queue: Gayane Petrosyan <gayane@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarKyle Milka <kmilka@chromium.org>
Cr-Commit-Position: refs/heads/master@{#791494}
parent e1402cf5
......@@ -170,7 +170,10 @@ public class ChromeActionModeHandler {
new ShareParams.Builder(mTab.getWindowAndroid(), /*url=*/"", /*title=*/"")
.setText(sanitizeTextForShare(mHelper.getSelectedText()))
.build(),
new ChromeShareExtras.Builder().setSaveLastUsed(true).build());
new ChromeShareExtras.Builder()
.setSaveLastUsed(true)
.setIsUserHighlightedText(true)
.build());
} else {
return mHelper.onActionItemClicked(mode, item);
}
......
......@@ -36,12 +36,16 @@ public class ChromeShareExtras {
*/
private final String mImageSrcUrl;
/** Indicates if text property is highlighted by user. */
private final boolean mIsUserHighlightedText;
private ChromeShareExtras(boolean saveLastUsed, boolean shareDirectly,
boolean isUrlOfVisiblePage, String imageSrcUrl) {
boolean isUrlOfVisiblePage, String imageSrcUrl, boolean isUserHighlightedText) {
mSaveLastUsed = saveLastUsed;
mShareDirectly = shareDirectly;
mIsUrlOfVisiblePage = isUrlOfVisiblePage;
mImageSrcUrl = imageSrcUrl;
mIsUserHighlightedText = isUserHighlightedText;
}
/**
......@@ -73,6 +77,13 @@ public class ChromeShareExtras {
return mImageSrcUrl;
}
/**
* @return Whether the URL is of the current visible page.
*/
public boolean isUserHighlightedText() {
return mIsUserHighlightedText;
}
/**
* The builder for {@link ChromeShareExtras} objects.
*/
......@@ -81,6 +92,7 @@ public class ChromeShareExtras {
private boolean mShareDirectly;
private boolean mIsUrlOfVisiblePage;
private String mImageSrcUrl;
private boolean mIsUserHighlightedText;
/**
* Sets whether to save the chosen activity for future direct sharing.
......@@ -115,9 +127,17 @@ public class ChromeShareExtras {
return this;
}
/**
* Sets whether text property is highlighted by user.
*/
public Builder setIsUserHighlightedText(boolean isUserHighlightedText) {
mIsUserHighlightedText = isUserHighlightedText;
return this;
}
public ChromeShareExtras build() {
return new ChromeShareExtras(
mSaveLastUsed, mShareDirectly, mIsUrlOfVisiblePage, mImageSrcUrl);
return new ChromeShareExtras(mSaveLastUsed, mShareDirectly, mIsUrlOfVisiblePage,
mImageSrcUrl, mIsUserHighlightedText);
}
}
}
......@@ -189,7 +189,8 @@ class ChromeProvidedSharingOptionsProvider {
},
/*isFirstParty=*/true);
return new FirstPartyOption(propertyModel,
Arrays.asList(ContentType.LINK_PAGE_VISIBLE, ContentType.TEXT, ContentType.IMAGE));
Arrays.asList(ContentType.LINK_PAGE_VISIBLE, ContentType.TEXT,
ContentType.HIGHLIGHTED_TEXT, ContentType.IMAGE));
}
private FirstPartyOption createCopyLinkFirstPartyOption() {
......@@ -232,7 +233,8 @@ class ChromeProvidedSharingOptionsProvider {
Toast.makeText(mActivity, R.string.text_copied, Toast.LENGTH_SHORT).show();
},
/*isFirstParty=*/true);
return new FirstPartyOption(propertyModel, Collections.singleton(ContentType.TEXT));
return new FirstPartyOption(
propertyModel, Arrays.asList(ContentType.TEXT, ContentType.HIGHLIGHTED_TEXT));
}
private FirstPartyOption createSendTabToSelfFirstPartyOption() {
......@@ -313,7 +315,8 @@ class ChromeProvidedSharingOptionsProvider {
// TODO(1102382): Init and call link-to-text feature.
},
/*isFirstParty=*/true);
return new FirstPartyOption(propertyModel, Collections.singleton(ContentType.TEXT));
return new FirstPartyOption(
propertyModel, Collections.singleton(ContentType.HIGHLIGHTED_TEXT));
}
/**
......
......@@ -100,8 +100,8 @@ public class ShareSheetCoordinator
mBottomSheet = new ShareSheetBottomSheetContent(activity, this);
mShareStartTime = shareStartTime;
Set<Integer> contentTypes = ShareSheetPropertyModelBuilder.getContentTypes(
params, chromeShareExtras.isUrlOfVisiblePage());
Set<Integer> contentTypes =
ShareSheetPropertyModelBuilder.getContentTypes(params, chromeShareExtras);
List<PropertyModel> chromeFeatures =
createTopRowPropertyModels(activity, params, chromeShareExtras, contentTypes);
List<PropertyModel> thirdPartyApps = createBottomRowPropertyModels(
......
......@@ -17,6 +17,7 @@ import androidx.annotation.IntDef;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.share.ChromeShareExtras;
import org.chromium.chrome.browser.share.ShareHelper;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.components.browser_ui.share.ShareParams;
......@@ -43,14 +44,15 @@ import java.util.Set;
// TODO(crbug/1022172): Should be package-protected once modularization is complete.
public class ShareSheetPropertyModelBuilder {
@IntDef({ContentType.LINK_PAGE_VISIBLE, ContentType.LINK_PAGE_NOT_VISIBLE, ContentType.TEXT,
ContentType.IMAGE, ContentType.OTHER_FILE_TYPE})
ContentType.IMAGE, ContentType.OTHER_FILE_TYPE, ContentType.HIGHLIGHTED_TEXT})
@Retention(RetentionPolicy.SOURCE)
@interface ContentType {
int LINK_PAGE_VISIBLE = 0;
int LINK_PAGE_NOT_VISIBLE = 1;
int TEXT = 2;
int IMAGE = 3;
int OTHER_FILE_TYPE = 4;
int HIGHLIGHTED_TEXT = 4;
int OTHER_FILE_TYPE = 5;
}
private static final int MAX_NUM_APPS = 7;
......@@ -58,9 +60,9 @@ public class ShareSheetPropertyModelBuilder {
// Variations parameter name for the comma-separated list of third-party activity names.
private static final String PARAM_SHARING_HUB_THIRD_PARTY_APPS = "sharing-hub-third-party-apps";
static final HashSet<Integer> ALL_CONTENT_TYPES = new HashSet<>(
Arrays.asList(ContentType.LINK_PAGE_VISIBLE, ContentType.LINK_PAGE_NOT_VISIBLE,
ContentType.TEXT, ContentType.IMAGE, ContentType.OTHER_FILE_TYPE));
static final HashSet<Integer> ALL_CONTENT_TYPES = new HashSet<>(Arrays.asList(
ContentType.LINK_PAGE_VISIBLE, ContentType.LINK_PAGE_NOT_VISIBLE, ContentType.TEXT,
ContentType.IMAGE, ContentType.HIGHLIGHTED_TEXT, ContentType.OTHER_FILE_TYPE));
private static final ArrayList<String> FALLBACK_ACTIVITIES =
new ArrayList<>(Arrays.asList("com.whatsapp.ContactPicker",
"com.facebook.composer.shareintent.ImplicitShareIntentHandlerDefaultAlias",
......@@ -99,17 +101,18 @@ public class ShareSheetPropertyModelBuilder {
* <li>If a URL is present, {@code isUrlOfVisiblePage} determines whether to add
* {@link ContentType.LINK_PAGE_VISIBLE} or {@link ContentType.LINK_PAGE_NOT_VISIBLE}.
* <li>If the text being shared is not the same as the URL, add {@link ContentType.TEXT}
* <li>If the share contains files and the {@code fileContentType} is an image, add
<li>If text is highlighted by user, add {@link ContentType.HIGHLIGHTED_TEXT}.
<li>If the share contains files and the {@code fileContentType} is an image, add
* {@link ContentType.IMAGE}. Otherwise, add {@link ContentType.OTHER_FILE_TYPE}.
* </ul>
*/
static Set<Integer> getContentTypes(ShareParams params, boolean isUrlOfVisiblePage) {
static Set<Integer> getContentTypes(ShareParams params, ChromeShareExtras chromeShareExtras) {
if (!ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARING_HUB_V15)) {
return ALL_CONTENT_TYPES;
}
Set<Integer> contentTypes = new HashSet<>();
if (!TextUtils.isEmpty(params.getUrl())) {
if (isUrlOfVisiblePage) {
if (chromeShareExtras.isUrlOfVisiblePage()) {
contentTypes.add(ContentType.LINK_PAGE_VISIBLE);
} else {
contentTypes.add(ContentType.LINK_PAGE_NOT_VISIBLE);
......@@ -117,7 +120,11 @@ public class ShareSheetPropertyModelBuilder {
}
if (!TextUtils.isEmpty(params.getText())
&& !TextUtils.equals(params.getUrl(), params.getText())) {
contentTypes.add(ContentType.TEXT);
if (chromeShareExtras.isUserHighlightedText()) {
contentTypes.add(ContentType.HIGHLIGHTED_TEXT);
} else {
contentTypes.add(ContentType.TEXT);
}
}
if (params.getFileUris() != null) {
if (!TextUtils.isEmpty(params.getFileContentType())
......
......@@ -150,7 +150,8 @@ public class ChromeProvidedSharingOptionsProviderTest {
@Test
@MediumTest
@Features.EnableFeatures({ChromeFeatureList.CHROME_SHARING_HUB_V15})
@Features.EnableFeatures({ChromeFeatureList.CHROME_SHARING_HUB_V15,
ChromeFeatureList.CHROME_SHARE_HIGHLIGHTS_ANDROID})
@Features.DisableFeatures(
{ChromeFeatureList.CHROME_SHARE_SCREENSHOT, ChromeFeatureList.CHROME_SHARE_QRCODE,
ChromeFeatureList.CHROME_SHARE_HIGHLIGHTS_ANDROID})
......@@ -233,7 +234,7 @@ public class ChromeProvidedSharingOptionsProviderTest {
setUpChromeProvidedSharingOptionsProviderTest(/*printingEnabled=*/false);
List<PropertyModel> propertyModels =
mChromeProvidedSharingOptionsProvider.getPropertyModels(
ImmutableSet.of(ContentType.TEXT));
ImmutableSet.of(ContentType.HIGHLIGHTED_TEXT));
Assert.assertEquals("Incorrect number of property models.", 2, propertyModels.size());
assertModelsAreInTheRightOrder(propertyModels,
......
......@@ -34,6 +34,7 @@ import org.mockito.MockitoAnnotations;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.share.ChromeShareExtras;
import org.chromium.chrome.browser.share.share_sheet.ShareSheetPropertyModelBuilder.ContentType;
import org.chromium.chrome.test.ChromeBrowserTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
......@@ -116,15 +117,15 @@ public final class ShareSheetPropertyModelBuilderTest {
@Features.EnableFeatures({ChromeFeatureList.CHROME_SHARING_HUB_V15})
public void getContentTypes_sharingHub15Enabled_hasCorrectLinkContentType() {
ShareParams shareParams = new ShareParams.Builder(null, "", URL).build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should contain LINK_PAGE_NOT_VISIBLE.",
ImmutableSet.of(ContentType.LINK_PAGE_NOT_VISIBLE),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, /*isUrlOfPageVisible=*/
false));
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
shareExtras = new ChromeShareExtras.Builder().setIsUrlOfVisiblePage(true).build();
assertEquals("Should contain LINK_PAGE_VISIBLE.",
ImmutableSet.of(ContentType.LINK_PAGE_VISIBLE),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, /*isUrlOfPageVisible=*/
true));
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
......@@ -132,13 +133,13 @@ public final class ShareSheetPropertyModelBuilderTest {
@Features.EnableFeatures({ChromeFeatureList.CHROME_SHARING_HUB_V15})
public void getContentTypes_sharingHub15EnabledAndNoUrl_hasNoLinkContentType() {
ShareParams shareParams = new ShareParams.Builder(null, "", "").build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should not contain LINK_PAGE_NOT_VISIBLE", ImmutableSet.of(),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, /*isUrlOfPageVisible=*/
false));
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
shareExtras = new ChromeShareExtras.Builder().setIsUrlOfVisiblePage(true).build();
assertEquals("Should not contain LINK_PAGE_VISIBLE.", ImmutableSet.of(),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, /*isUrlOfPageVisible=*/
true));
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
......@@ -146,10 +147,10 @@ public final class ShareSheetPropertyModelBuilderTest {
@Features.EnableFeatures({ChromeFeatureList.CHROME_SHARING_HUB_V15})
public void getContentTypes_sharingHub15EnabledAndUrlDifferentFromText_hasTextContentType() {
ShareParams shareParams = new ShareParams.Builder(null, "", "").setText("testText").build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should contain TEXT.", ImmutableSet.of(ContentType.TEXT),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, /*isUrlOfPageVisible=*/
false));
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
......@@ -157,10 +158,24 @@ public final class ShareSheetPropertyModelBuilderTest {
@Features.EnableFeatures({ChromeFeatureList.CHROME_SHARING_HUB_V15})
public void getContentTypes_sharingHub15EnabledAndTextIsNull_hasNoTextContentType() {
ShareParams shareParams = new ShareParams.Builder(null, "", "").build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should not contain TEXT.", ImmutableSet.of(),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, /*isUrlOfPageVisible=*/
false));
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
@MediumTest
@Features.EnableFeatures({ChromeFeatureList.CHROME_SHARING_HUB_V15})
public void
getContentTypes_sharingHub15EnabledAndUrlDifferentFromText_hasHighlightedTextContentType() {
ShareParams shareParams = new ShareParams.Builder(null, "", "").setText("testText").build();
ChromeShareExtras shareExtras =
new ChromeShareExtras.Builder().setIsUserHighlightedText(true).build();
assertEquals("Should contain HIGHLIGHTED_TEXT.",
ImmutableSet.of(ContentType.HIGHLIGHTED_TEXT),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
......@@ -171,10 +186,10 @@ public final class ShareSheetPropertyModelBuilderTest {
.setFileUris(new ArrayList<>(ImmutableSet.of(Uri.EMPTY)))
.setFileContentType(IMAGE_TYPE)
.build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should contain IMAGE.", ImmutableSet.of(ContentType.IMAGE),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, /*isUrlOfPageVisible=*/
false));
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
......@@ -183,10 +198,10 @@ public final class ShareSheetPropertyModelBuilderTest {
public void getContentTypes_sharingHub15EnabledAndNoFiles_hasNoImageContentType() {
ShareParams shareParams =
new ShareParams.Builder(null, "", "").setFileContentType(IMAGE_TYPE).build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should not contain IMAGE.", ImmutableSet.of(),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, /*isUrlOfPageVisible=*/
false));
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
......@@ -198,11 +213,11 @@ public final class ShareSheetPropertyModelBuilderTest {
.setFileUris(new ArrayList<>(ImmutableList.of(Uri.EMPTY, Uri.EMPTY)))
.setFileContentType("*/*")
.build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should contain OTHER_FILE_TYPE.",
ImmutableSet.of(ContentType.OTHER_FILE_TYPE),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, /*isUrlOfPageVisible=*/
false));
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
......@@ -211,10 +226,10 @@ public final class ShareSheetPropertyModelBuilderTest {
public void getContentTypes_sharingHub15EnabledAndNoFiles_hasNoFileContentType() {
ShareParams shareParams =
new ShareParams.Builder(null, "", "").setFileContentType("*/*").build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should not contain OTHER_FILE_TYPE.", ImmutableSet.of(),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, /*isUrlOfPageVisible=*/
false));
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
......@@ -227,12 +242,12 @@ public final class ShareSheetPropertyModelBuilderTest {
.setFileUris(new ArrayList<>(ImmutableList.of(Uri.EMPTY, Uri.EMPTY)))
.setFileContentType("*/*")
.build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should contain correct content types.",
ImmutableSet.of(ContentType.LINK_PAGE_NOT_VISIBLE, ContentType.OTHER_FILE_TYPE,
ContentType.TEXT),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, /*isUrlOfPageVisible=*/
false));
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
......@@ -241,7 +256,7 @@ public final class ShareSheetPropertyModelBuilderTest {
public void getContentTypes_sharingHub15Disabled_returnsAllContentTypes() {
assertEquals("Should contain all content types.",
ShareSheetPropertyModelBuilder.ALL_CONTENT_TYPES,
ShareSheetPropertyModelBuilder.getContentTypes(null, false));
ShareSheetPropertyModelBuilder.getContentTypes(null, null));
}
@Test
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment