Commit a2d572a2 authored by Sophey Dong's avatar Sophey Dong Committed by Commit Bot

[Sharing Hub] Add text selection entry point.

Bug: 1079467
Change-Id: I492cd2771ddac88710a9219b8335eafdccf707c1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2246146
Commit-Queue: Sophey Dong <sophey@chromium.org>
Reviewed-by: default avatarTanya Gupta <tgupta@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarLijin Shen <lazzzis@google.com>
Reviewed-by: default avatarKyle Milka <kmilka@chromium.org>
Cr-Commit-Position: refs/heads/master@{#780188}
parent a8e28e15
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package org.chromium.chrome.browser; package org.chromium.chrome.browser;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.text.TextUtils;
import android.view.ActionMode; import android.view.ActionMode;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
...@@ -16,11 +17,16 @@ import org.chromium.base.CollectionUtil; ...@@ -16,11 +17,16 @@ import org.chromium.base.CollectionUtil;
import org.chromium.base.Consumer; import org.chromium.base.Consumer;
import org.chromium.base.PackageManagerUtils; import org.chromium.base.PackageManagerUtils;
import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.metrics.RecordUserAction;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.browser.firstrun.FirstRunStatus; import org.chromium.chrome.browser.firstrun.FirstRunStatus;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.locale.LocaleManager; import org.chromium.chrome.browser.locale.LocaleManager;
import org.chromium.chrome.browser.share.ChromeShareExtras;
import org.chromium.chrome.browser.share.ShareDelegate;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabUtils; import org.chromium.chrome.browser.tab.TabUtils;
import org.chromium.chrome.browser.tab.TabWebContentsObserver; import org.chromium.chrome.browser.tab.TabWebContentsObserver;
import org.chromium.components.browser_ui.share.ShareParams;
import org.chromium.content.R; import org.chromium.content.R;
import org.chromium.content_public.browser.ActionModeCallbackHelper; import org.chromium.content_public.browser.ActionModeCallbackHelper;
import org.chromium.content_public.browser.SelectionPopupController; import org.chromium.content_public.browser.SelectionPopupController;
...@@ -46,13 +52,16 @@ public class ChromeActionModeHandler { ...@@ -46,13 +52,16 @@ public class ChromeActionModeHandler {
* @param actionBarObserver observer called when the contextual action bar's visibility * @param actionBarObserver observer called when the contextual action bar's visibility
* has changed. * has changed.
* @param searchCallback Callback to run when search action is selected in the action mode. * @param searchCallback Callback to run when search action is selected in the action mode.
* @param shareDelegateSupplier The {@link Supplier} of the {@link ShareDelegate} that will be
* notified when a share action is performed.
*/ */
public ChromeActionModeHandler(ActivityTabProvider activityTabProvider, public ChromeActionModeHandler(ActivityTabProvider activityTabProvider,
Consumer<Boolean> actionBarObserver, Callback<String> searchCallback) { Consumer<Boolean> actionBarObserver, Callback<String> searchCallback,
Supplier<ShareDelegate> shareDelegateSupplier) {
mInitWebContentsObserver = (webContents) -> { mInitWebContentsObserver = (webContents) -> {
SelectionPopupController.fromWebContents(webContents) SelectionPopupController.fromWebContents(webContents)
.setActionModeCallback(new ActionModeCallback( .setActionModeCallback(new ActionModeCallback(mActiveTab, webContents,
mActiveTab, webContents, actionBarObserver, searchCallback)); actionBarObserver, searchCallback, shareDelegateSupplier));
}; };
mActivityTabTabObserver = mActivityTabTabObserver =
...@@ -78,17 +87,25 @@ public class ChromeActionModeHandler { ...@@ -78,17 +87,25 @@ public class ChromeActionModeHandler {
@VisibleForTesting @VisibleForTesting
static class ActionModeCallback implements ActionMode.Callback { static class ActionModeCallback implements ActionMode.Callback {
/**
* Android Intent size limitations prevent sending over a megabyte of data. Limit
* query lengths to 100kB because other things may be added to the Intent.
*/
private static final int MAX_SHARE_QUERY_LENGTH_CHARS = 100000;
private final Tab mTab; private final Tab mTab;
private final ActionModeCallbackHelper mHelper; private final ActionModeCallbackHelper mHelper;
private final Consumer<Boolean> mActionBarObserver; private final Consumer<Boolean> mActionBarObserver;
private final Callback<String> mSearchCallback; private final Callback<String> mSearchCallback;
private final Supplier<ShareDelegate> mShareDelegateSupplier;
protected ActionModeCallback(Tab tab, WebContents webContents, Consumer<Boolean> observer, ActionModeCallback(Tab tab, WebContents webContents, Consumer<Boolean> observer,
Callback<String> searchCallback) { Callback<String> searchCallback, Supplier<ShareDelegate> shareDelegateSupplier) {
mTab = tab; mTab = tab;
mHelper = getActionModeCallbackHelper(webContents); mHelper = getActionModeCallbackHelper(webContents);
mActionBarObserver = observer; mActionBarObserver = observer;
mSearchCallback = searchCallback; mSearchCallback = searchCallback;
mShareDelegateSupplier = shareDelegateSupplier;
} }
@VisibleForTesting @VisibleForTesting
...@@ -148,6 +165,13 @@ public class ChromeActionModeHandler { ...@@ -148,6 +165,13 @@ public class ChromeActionModeHandler {
LocaleManager.getInstance().showSearchEnginePromoIfNeeded( LocaleManager.getInstance().showSearchEnginePromoIfNeeded(
TabUtils.getActivity(mTab), callback); TabUtils.getActivity(mTab), callback);
mHelper.finishActionMode(); mHelper.finishActionMode();
} else if (ChromeFeatureList.isEnabled(ChromeFeatureList.CHROME_SHARING_HUB_V15)
&& item.getItemId() == R.id.select_action_menu_share) {
mShareDelegateSupplier.get().share(
new ShareParams.Builder(mTab.getWindowAndroid(), /*url=*/"", /*title=*/"")
.setText(sanitizeTextForShare(mHelper.getSelectedText()))
.build(),
new ChromeShareExtras.Builder().setSaveLastUsed(true).build());
} else { } else {
return mHelper.onActionItemClicked(mode, item); return mHelper.onActionItemClicked(mode, item);
} }
...@@ -182,5 +206,12 @@ public class ChromeActionModeHandler { ...@@ -182,5 +206,12 @@ public class ChromeActionModeHandler {
RecordUserAction.record("MobileActionBarShown.Toolbar"); RecordUserAction.record("MobileActionBarShown.Toolbar");
} }
} }
private static String sanitizeTextForShare(String text) {
if (TextUtils.isEmpty(text) || text.length() < MAX_SHARE_QUERY_LENGTH_CHARS) {
return text;
}
return text.substring(0, MAX_SHARE_QUERY_LENGTH_CHARS) + "…";
}
} }
} }
...@@ -322,7 +322,7 @@ public class RootUiCoordinator ...@@ -322,7 +322,7 @@ public class RootUiCoordinator
selector.openNewTab(generateUrlParamsForSearch(tab, query), selector.openNewTab(generateUrlParamsForSearch(tab, query),
TabLaunchType.FROM_LONGPRESS_FOREGROUND, tab, tab.isIncognito()); TabLaunchType.FROM_LONGPRESS_FOREGROUND, tab, tab.isIncognito());
}); }, mShareDelegateSupplier);
mVrModeObserver = new VrModeObserver() { mVrModeObserver = new VrModeObserver() {
@Override @Override
public void onEnterVr() { public void onEnterVr() {
......
...@@ -59,8 +59,8 @@ public class ChromeActionModeHandlerUnitTest { ...@@ -59,8 +59,8 @@ public class ChromeActionModeHandlerUnitTest {
private Menu mMenu; private Menu mMenu;
private class TestChromeActionModeCallback extends ChromeActionModeHandler.ActionModeCallback { private class TestChromeActionModeCallback extends ChromeActionModeHandler.ActionModeCallback {
public TestChromeActionModeCallback(Tab tab, ActionModeCallbackHelper helper) { TestChromeActionModeCallback(Tab tab, ActionModeCallbackHelper helper) {
super(tab, null, visible -> {}, urlParams -> {}); super(tab, null, visible -> {}, urlParams -> {}, null);
} }
@Override @Override
......
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