Commit db8b48d4 authored by Kyle Milka's avatar Kyle Milka Committed by Commit Bot

[SharingHub] Refactor existing share/ code

Refactor existing code for handling share actions (ShareHelper and
ShareMenuActionHandler) to better fit the MVC model. This is a starting
point for work on the Chrome sharing hub/custom share sheet.

go/chrome-sharing-hub-dd

Bug: 1009124
Change-Id: I6f3825fed98d896507f44d033d953b54cd32131f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1850367
Commit-Queue: Kyle Milka <kmilka@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Cr-Commit-Position: refs/heads/master@{#710020}
parent 9981a89a
...@@ -1454,8 +1454,9 @@ chrome_java_sources = [ ...@@ -1454,8 +1454,9 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/share/ShareActivity.java", "java/src/org/chromium/chrome/browser/share/ShareActivity.java",
"java/src/org/chromium/chrome/browser/share/ShareDialogAdapter.java", "java/src/org/chromium/chrome/browser/share/ShareDialogAdapter.java",
"java/src/org/chromium/chrome/browser/share/ShareHelper.java", "java/src/org/chromium/chrome/browser/share/ShareHelper.java",
"java/src/org/chromium/chrome/browser/share/ShareMenuActionHandler.java",
"java/src/org/chromium/chrome/browser/share/ShareParams.java", "java/src/org/chromium/chrome/browser/share/ShareParams.java",
"java/src/org/chromium/chrome/browser/share/ShareSheetCoordinator.java",
"java/src/org/chromium/chrome/browser/share/ShareSheetMediator.java",
"java/src/org/chromium/chrome/browser/sharing/SharingAdapter.java", "java/src/org/chromium/chrome/browser/sharing/SharingAdapter.java",
"java/src/org/chromium/chrome/browser/sharing/SharingNotificationUtil.java", "java/src/org/chromium/chrome/browser/sharing/SharingNotificationUtil.java",
"java/src/org/chromium/chrome/browser/sharing/click_to_call/ClickToCallMessageHandler.java", "java/src/org/chromium/chrome/browser/sharing/click_to_call/ClickToCallMessageHandler.java",
......
...@@ -421,8 +421,8 @@ chrome_test_java_sources = [ ...@@ -421,8 +421,8 @@ chrome_test_java_sources = [
"javatests/src/org/chromium/chrome/browser/services/GoogleServicesManagerIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/services/GoogleServicesManagerIntegrationTest.java",
"javatests/src/org/chromium/chrome/browser/shape_detection/ShapeDetectionTest.java", "javatests/src/org/chromium/chrome/browser/shape_detection/ShapeDetectionTest.java",
"javatests/src/org/chromium/chrome/browser/share/LensUtilsTest.java", "javatests/src/org/chromium/chrome/browser/share/LensUtilsTest.java",
"javatests/src/org/chromium/chrome/browser/share/ShareMenuActionHandlerIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/share/ShareSheetMediatorIntegrationTest.java",
"javatests/src/org/chromium/chrome/browser/share/ShareMenuActionHandlerTest.java", "javatests/src/org/chromium/chrome/browser/share/ShareSheetMediatorTest.java",
"javatests/src/org/chromium/chrome/browser/share/ShareUrlTest.java", "javatests/src/org/chromium/chrome/browser/share/ShareUrlTest.java",
"javatests/src/org/chromium/chrome/browser/signin/IdentityManagerIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/signin/IdentityManagerIntegrationTest.java",
"javatests/src/org/chromium/chrome/browser/signin/OAuth2TokenServiceTest.java", "javatests/src/org/chromium/chrome/browser/signin/OAuth2TokenServiceTest.java",
......
...@@ -145,7 +145,7 @@ def _CheckCompatibleAlertDialogBuilder(input_api, output_api): ...@@ -145,7 +145,7 @@ def _CheckCompatibleAlertDialogBuilder(input_api, output_api):
BROWSER_ROOT + 'externalnav/ExternalNavigationDelegateImpl.java', BROWSER_ROOT + 'externalnav/ExternalNavigationDelegateImpl.java',
BROWSER_ROOT + 'payments/AndroidPaymentApp.java', BROWSER_ROOT + 'payments/AndroidPaymentApp.java',
BROWSER_ROOT + 'permissions/AndroidPermissionRequester.java', BROWSER_ROOT + 'permissions/AndroidPermissionRequester.java',
BROWSER_ROOT + 'share/ShareHelper.java', BROWSER_ROOT + 'share/ShareSheetMediator.java',
BROWSER_ROOT + 'util/AccessibilityUtil.java', BROWSER_ROOT + 'util/AccessibilityUtil.java',
BROWSER_ROOT + 'webapps/AddToHomescreenDialog.java', BROWSER_ROOT + 'webapps/AddToHomescreenDialog.java',
BROWSER_ROOT + 'webapps/WebappOfflineDialog.java', BROWSER_ROOT + 'webapps/WebappOfflineDialog.java',
......
...@@ -124,7 +124,6 @@ import org.chromium.chrome.browser.preferences.PrefServiceBridge; ...@@ -124,7 +124,6 @@ import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.preferences.PreferencesLauncher; import org.chromium.chrome.browser.preferences.PreferencesLauncher;
import org.chromium.chrome.browser.printing.TabPrinter; import org.chromium.chrome.browser.printing.TabPrinter;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.share.ShareMenuActionHandler;
import org.chromium.chrome.browser.snackbar.BottomContainer; import org.chromium.chrome.browser.snackbar.BottomContainer;
import org.chromium.chrome.browser.snackbar.SnackbarManager; import org.chromium.chrome.browser.snackbar.SnackbarManager;
import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable; import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable;
...@@ -1559,19 +1558,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -1559,19 +1558,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
/**
* Triggered when the share menu item is selected.
* This creates and shows a share intent picker dialog or starts a share intent directly.
* @param shareDirectly Whether it should share directly with the activity that was most
* recently used to share.
* @param isIncognito Whether currentTab is incognito.
*/
@VisibleForTesting
public void onShareMenuItemSelected(final boolean shareDirectly, final boolean isIncognito) {
ShareMenuActionHandler.getInstance().onShareMenuItemSelected(
this, getActivityTab(), shareDirectly, isIncognito);
}
/** /**
* @return Whether the activity is in overview mode. * @return Whether the activity is in overview mode.
*/ */
...@@ -2197,9 +2183,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent> ...@@ -2197,9 +2183,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
Tracker tracker = TrackerFactory.getTrackerForProfile(getActivityTab().getProfile()); Tracker tracker = TrackerFactory.getTrackerForProfile(getActivityTab().getProfile());
tracker.notifyEvent(EventConstants.TRANSLATE_MENU_BUTTON_CLICKED); tracker.notifyEvent(EventConstants.TRANSLATE_MENU_BUTTON_CLICKED);
TranslateBridge.translateTabWhenReady(getActivityTab()); TranslateBridge.translateTabWhenReady(getActivityTab());
} else if (id == R.id.share_menu_id || id == R.id.direct_share_menu_id) {
onShareMenuItemSelected(id == R.id.direct_share_menu_id,
getCurrentTabModel().isIncognito());
} else if (id == R.id.print_id) { } else if (id == R.id.print_id) {
PrintingController printingController = PrintingControllerImpl.getInstance(); PrintingController printingController = PrintingControllerImpl.getInstance();
if (printingController != null && !printingController.isBusy() if (printingController != null && !printingController.isBusy()
......
...@@ -25,8 +25,8 @@ import org.chromium.chrome.browser.locale.LocaleManager; ...@@ -25,8 +25,8 @@ import org.chromium.chrome.browser.locale.LocaleManager;
import org.chromium.chrome.browser.preferences.ChromePreferenceManager; import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
import org.chromium.chrome.browser.share.LensUtils; import org.chromium.chrome.browser.share.LensUtils;
import org.chromium.chrome.browser.share.ShareHelper;
import org.chromium.chrome.browser.share.ShareParams; import org.chromium.chrome.browser.share.ShareParams;
import org.chromium.chrome.browser.share.ShareSheetCoordinator;
import org.chromium.chrome.browser.util.UrlUtilities; import org.chromium.chrome.browser.util.UrlUtilities;
import org.chromium.components.search_engines.TemplateUrlService; import org.chromium.components.search_engines.TemplateUrlService;
import org.chromium.components.url_formatter.UrlFormatter; import org.chromium.components.url_formatter.UrlFormatter;
...@@ -543,7 +543,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { ...@@ -543,7 +543,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
.setShareDirectly(false) .setShareDirectly(false)
.setSaveLastUsed(true) .setSaveLastUsed(true)
.build(); .build();
ShareHelper.share(linkShareParams); ShareSheetCoordinator.create().share(linkShareParams);
} else if (itemId == R.id.contextmenu_search_with_google_lens) { } else if (itemId == R.id.contextmenu_search_with_google_lens) {
ContextMenuUma.record(params, ContextMenuUma.Action.SEARCH_WITH_GOOGLE_LENS); ContextMenuUma.record(params, ContextMenuUma.Action.SEARCH_WITH_GOOGLE_LENS);
helper.searchWithGoogleLens(mDelegate.isIncognito()); helper.searchWithGoogleLens(mDelegate.isIncognito());
......
...@@ -233,7 +233,7 @@ public class RevampedContextMenuCoordinator implements ContextMenuUi { ...@@ -233,7 +233,7 @@ public class RevampedContextMenuCoordinator implements ContextMenuUi {
.setShareDirectly(true) .setShareDirectly(true)
.setSaveLastUsed(false) .setSaveLastUsed(false)
.build(); .build();
ShareHelper.share(shareParams); ShareHelper.shareDirectly(shareParams);
} else { } else {
mOnShareImageDirectly.run(); mOnShareImageDirectly.run();
} }
......
...@@ -28,7 +28,7 @@ import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionUiType; ...@@ -28,7 +28,7 @@ import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionUiType;
import org.chromium.chrome.browser.omnibox.suggestions.SuggestionProcessor; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionProcessor;
import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionHost; import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionHost;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.share.ShareMenuActionHandler; import org.chromium.chrome.browser.share.ShareSheetCoordinator;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.ui.base.Clipboard; import org.chromium.ui.base.Clipboard;
import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel;
...@@ -305,7 +305,7 @@ public class EditUrlSuggestionProcessor implements OnClickListener, SuggestionPr ...@@ -305,7 +305,7 @@ public class EditUrlSuggestionProcessor implements OnClickListener, SuggestionPr
mLocationBarDelegate.clearOmniboxFocus(); mLocationBarDelegate.clearOmniboxFocus();
// TODO(mdjones): This should only share the displayed URL instead of the background // TODO(mdjones): This should only share the displayed URL instead of the background
// tab. // tab.
ShareMenuActionHandler.getInstance().onShareMenuItemSelected( ShareSheetCoordinator.create().onShareSelected(
activityTab.getActivity(), activityTab, false, activityTab.isIncognito()); activityTab.getActivity(), activityTab, false, activityTab.isIncognito());
} else if (R.id.url_edit_icon == view.getId()) { } else if (R.id.url_edit_icon == view.getId()) {
ENUMERATED_SUGGESTION_ACTION.record(SuggestionAction.EDIT); ENUMERATED_SUGGESTION_ACTION.record(SuggestionAction.EDIT);
......
...@@ -323,27 +323,15 @@ public class ShareHelper { ...@@ -323,27 +323,15 @@ public class ShareHelper {
} }
/** /**
* Creates and shows a share intent picker dialog or starts a share intent directly with the * Share directly with the last used share target.
* activity that was most recently used to share based on shareDirectly value.
*
* This function will save |screenshot| under {app's root}/files/images/screenshot (or
* /sdcard/DCIM/browser-images/screenshot if ADK is lower than JB MR2).
* Cleaning up doesn't happen automatically, and so an app should call clearSharedScreenshots()
* explicitly when needed.
*
* @param params The container holding the share parameters. * @param params The container holding the share parameters.
*/ */
public static void share(ShareParams params) { public static void shareDirectly(ShareParams params) {
if (params.shareDirectly()) { assert params.shareDirectly();
ComponentName component = getLastShareComponentName(params.getSourcePackageName()); ComponentName component = getLastShareComponentName(params.getSourcePackageName());
if (component == null) return; if (component == null) return;
assert params.getCallback() == null; assert params.getCallback() == null;
makeIntentAndShare(params, component); makeIntentAndShare(params, component);
} else if (TargetChosenReceiver.isSupported()) {
makeIntentAndShare(params, null);
} else {
showShareDialog(params);
}
} }
/** /**
...@@ -512,7 +500,7 @@ public class ShareHelper { ...@@ -512,7 +500,7 @@ public class ShareHelper {
* *
* @param params The container holding the share parameters. * @param params The container holding the share parameters.
*/ */
private static void showShareDialog(final ShareParams params) { static void showShareDialog(final ShareParams params) {
Activity activity = params.getWindow().getActivity().get(); Activity activity = params.getWindow().getActivity().get();
final TargetChosenCallback callback = params.getCallback(); final TargetChosenCallback callback = params.getCallback();
Intent intent = getShareLinkAppCompatibilityIntent(); Intent intent = getShareLinkAppCompatibilityIntent();
...@@ -572,7 +560,7 @@ public class ShareHelper { ...@@ -572,7 +560,7 @@ public class ShareHelper {
} }
} }
private static void makeIntentAndShare(ShareParams params, @Nullable ComponentName component) { static void makeIntentAndShare(ShareParams params, @Nullable ComponentName component) {
Intent intent = getShareLinkIntent(params); Intent intent = getShareLinkIntent(params);
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
intent.setComponent(component); intent.setComponent(component);
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.share;
import android.app.Activity;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.tab.Tab;
/**
* Coordinator for displaying the share sheet.
*/
public class ShareSheetCoordinator {
private ShareSheetMediator mMediator;
/**
* Create and return a new ShareSheetCoordinator.
*/
public static ShareSheetCoordinator create() {
return new ShareSheetCoordinator();
}
/**
* Constructs a new ShareSheetCoordinator.
*/
private ShareSheetCoordinator() {
mMediator = new ShareSheetMediator(new ShareSheetMediator.ShareSheetDelegate());
}
/**
* Triggered when the share menu item is selected.
* This creates and shows a share intent picker dialog or starts a share intent directly.
* @param activity The activity that triggered this share action.
* @param tab The tab containing the content to be shared.
* @param shareDirectly Whether it should share directly with the activity that was most
* recently used to share.
* @param isIncognito Whether currentTab is incognito.
*/
public void onShareSelected(
Activity activity, Tab currentTab, boolean shareDirectly, boolean isIncognito) {
mMediator.onShareSelected(activity, currentTab, shareDirectly, isIncognito);
}
/**
* Triggers a share based on the provided {@link ShareParams}.
* @param params The container holding the share parameters.
*/
public void share(ShareParams params) {
mMediator.share(params);
}
@VisibleForTesting
public static void setScreenshotCaptureSkippedForTesting(boolean value) {
ShareSheetMediator.setScreenshotCaptureSkippedForTesting(value);
}
}
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
package org.chromium.chrome.browser.toolbar; package org.chromium.chrome.browser.toolbar;
import android.app.Activity;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
...@@ -76,6 +77,7 @@ import org.chromium.chrome.browser.previews.PreviewsAndroidBridge; ...@@ -76,6 +77,7 @@ import org.chromium.chrome.browser.previews.PreviewsAndroidBridge;
import org.chromium.chrome.browser.previews.PreviewsUma; import org.chromium.chrome.browser.previews.PreviewsUma;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
import org.chromium.chrome.browser.share.ShareSheetCoordinator;
import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.EmptyTabObserver;
import org.chromium.chrome.browser.tab.SadTab; import org.chromium.chrome.browser.tab.SadTab;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
...@@ -760,11 +762,15 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF ...@@ -760,11 +762,15 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
final OnClickListener shareButtonListener = v -> { final OnClickListener shareButtonListener = v -> {
recordBottomToolbarUseForIPH(); recordBottomToolbarUseForIPH();
RecordUserAction.record("MobileBottomToolbarShareButton"); RecordUserAction.record("MobileBottomToolbarShareButton");
Tab tab = null;
Activity activity = null;
boolean isIncognito = false; boolean isIncognito = false;
if (mTabModelSelector != null) { if (mTabModelSelector != null) {
isIncognito = mTabModelSelector.getCurrentTab().isIncognito(); tab = mTabModelSelector.getCurrentTab();
activity = tab.getActivity();
isIncognito = tab.isIncognito();
} }
mActivity.onShareMenuItemSelected(false, isIncognito); ShareSheetCoordinator.create().onShareSelected(activity, tab, false, isIncognito);
}; };
mBottomControlsCoordinator = new BottomControlsCoordinator(mActivity.getFullscreenManager(), mBottomControlsCoordinator = new BottomControlsCoordinator(mActivity.getFullscreenManager(),
......
...@@ -10,6 +10,7 @@ import org.chromium.base.Callback; ...@@ -10,6 +10,7 @@ import org.chromium.base.Callback;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.MenuOrKeyboardActionController; import org.chromium.chrome.browser.MenuOrKeyboardActionController;
import org.chromium.chrome.browser.appmenu.AppMenuBlocker; import org.chromium.chrome.browser.appmenu.AppMenuBlocker;
...@@ -25,6 +26,7 @@ import org.chromium.chrome.browser.findinpage.FindToolbarObserver; ...@@ -25,6 +26,7 @@ import org.chromium.chrome.browser.findinpage.FindToolbarObserver;
import org.chromium.chrome.browser.lifecycle.Destroyable; import org.chromium.chrome.browser.lifecycle.Destroyable;
import org.chromium.chrome.browser.lifecycle.InflationObserver; import org.chromium.chrome.browser.lifecycle.InflationObserver;
import org.chromium.chrome.browser.metrics.UkmRecorder; import org.chromium.chrome.browser.metrics.UkmRecorder;
import org.chromium.chrome.browser.share.ShareSheetCoordinator;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.vr.VrModeObserver; import org.chromium.chrome.browser.vr.VrModeObserver;
import org.chromium.chrome.browser.vr.VrModuleProvider; import org.chromium.chrome.browser.vr.VrModuleProvider;
...@@ -43,6 +45,7 @@ public class RootUiCoordinator ...@@ -43,6 +45,7 @@ public class RootUiCoordinator
protected ChromeActivity mActivity; protected ChromeActivity mActivity;
protected @Nullable AppMenuCoordinator mAppMenuCoordinator; protected @Nullable AppMenuCoordinator mAppMenuCoordinator;
private final MenuOrKeyboardActionController mMenuOrKeyboardActionController; private final MenuOrKeyboardActionController mMenuOrKeyboardActionController;
private ActivityTabProvider mActivityTabProvider;
protected @Nullable FindToolbarManager mFindToolbarManager; protected @Nullable FindToolbarManager mFindToolbarManager;
private @Nullable FindToolbarObserver mFindToolbarObserver; private @Nullable FindToolbarObserver mFindToolbarObserver;
...@@ -68,6 +71,7 @@ public class RootUiCoordinator ...@@ -68,6 +71,7 @@ public class RootUiCoordinator
mMenuOrKeyboardActionController = mActivity.getMenuOrKeyboardActionController(); mMenuOrKeyboardActionController = mActivity.getMenuOrKeyboardActionController();
mMenuOrKeyboardActionController.registerMenuOrKeyboardActionHandler(this); mMenuOrKeyboardActionController.registerMenuOrKeyboardActionHandler(this);
mActivityTabProvider = mActivity.getActivityTabProvider();
mLayoutManagerSupplierCallback = this::onLayoutManagerAvailable; mLayoutManagerSupplierCallback = this::onLayoutManagerAvailable;
mActivity.getLayoutManagerSupplier().addObserver(mLayoutManagerSupplierCallback); mActivity.getLayoutManagerSupplier().addObserver(mLayoutManagerSupplierCallback);
...@@ -126,6 +130,19 @@ public class RootUiCoordinator ...@@ -126,6 +130,19 @@ public class RootUiCoordinator
VrModuleProvider.registerVrModeObserver(mVrModeObserver); VrModuleProvider.registerVrModeObserver(mVrModeObserver);
} }
/**
* Triggered when the share menu item is selected.
* This creates and shows a share intent picker dialog or starts a share intent directly.
* @param shareDirectly Whether it should share directly with the activity that was most
* recently used to share.
* @param isIncognito Whether currentTab is incognito.
*/
@VisibleForTesting
public void onShareMenuItemSelected(final boolean shareDirectly, final boolean isIncognito) {
ShareSheetCoordinator.create().onShareSelected(
mActivity, mActivityTabProvider.get(), shareDirectly, isIncognito);
}
// MenuOrKeyboardActionHandler implementation // MenuOrKeyboardActionHandler implementation
@Override @Override
...@@ -146,6 +163,9 @@ public class RootUiCoordinator ...@@ -146,6 +163,9 @@ public class RootUiCoordinator
RecordUserAction.record("MobileShortcutFindInPage"); RecordUserAction.record("MobileShortcutFindInPage");
} }
return true; return true;
} else if (id == R.id.share_menu_id || id == R.id.direct_share_menu_id) {
onShareMenuItemSelected(id == R.id.direct_share_menu_id,
mActivity.getTabModelSelector().isIncognitoSelected());
} }
return false; return false;
......
...@@ -23,6 +23,7 @@ import org.chromium.chrome.browser.notifications.NotificationMetadata; ...@@ -23,6 +23,7 @@ import org.chromium.chrome.browser.notifications.NotificationMetadata;
import org.chromium.chrome.browser.notifications.NotificationUmaTracker; import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
import org.chromium.chrome.browser.notifications.PendingIntentProvider; import org.chromium.chrome.browser.notifications.PendingIntentProvider;
import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions; import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions;
import org.chromium.chrome.browser.share.ShareSheetCoordinator;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.chrome.browser.util.IntentUtils;
import org.chromium.ui.base.Clipboard; import org.chromium.ui.base.Clipboard;
...@@ -131,8 +132,9 @@ class WebappActionsNotificationManager { ...@@ -131,8 +132,9 @@ class WebappActionsNotificationManager {
if (ACTION_SHARE.equals(intent.getAction())) { if (ACTION_SHARE.equals(intent.getAction())) {
// Not routing through onMenuOrKeyboardAction to control UMA String. // Not routing through onMenuOrKeyboardAction to control UMA String.
webappActivity.onShareMenuItemSelected( Tab tab = webappActivity.getActivityTab();
false /* share directly */, webappActivity.getCurrentTabModel().isIncognito()); boolean isIncognito = tab.isIncognito();
ShareSheetCoordinator.create().onShareSelected(webappActivity, tab, false, isIncognito);
RecordUserAction.record("Webapp.NotificationShare"); RecordUserAction.record("Webapp.NotificationShare");
return true; return true;
} else if (ACTION_OPEN_IN_CHROME.equals(intent.getAction())) { } else if (ACTION_OPEN_IN_CHROME.equals(intent.getAction())) {
......
...@@ -22,6 +22,7 @@ import org.chromium.base.task.TaskTraits; ...@@ -22,6 +22,7 @@ import org.chromium.base.task.TaskTraits;
import org.chromium.chrome.browser.safe_browsing.FileTypePolicies; import org.chromium.chrome.browser.safe_browsing.FileTypePolicies;
import org.chromium.chrome.browser.share.ShareHelper; import org.chromium.chrome.browser.share.ShareHelper;
import org.chromium.chrome.browser.share.ShareParams; import org.chromium.chrome.browser.share.ShareParams;
import org.chromium.chrome.browser.share.ShareSheetCoordinator;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.mojo.system.MojoException; import org.chromium.mojo.system.MojoException;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
...@@ -185,7 +186,7 @@ public class ShareServiceImpl implements ShareService { ...@@ -185,7 +186,7 @@ public class ShareServiceImpl implements ShareService {
.setCallback(innerCallback); .setCallback(innerCallback);
if (files == null || files.length == 0) { if (files == null || files.length == 0) {
ShareHelper.share(paramsBuilder.build()); ShareSheetCoordinator.create().share(paramsBuilder.build());
return; return;
} }
......
...@@ -6,8 +6,8 @@ package org.chromium.chrome.browser.webshare; ...@@ -6,8 +6,8 @@ package org.chromium.chrome.browser.webshare;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.base.task.PostTask; import org.chromium.base.task.PostTask;
import org.chromium.chrome.browser.share.ShareHelper;
import org.chromium.chrome.browser.share.ShareParams; import org.chromium.chrome.browser.share.ShareParams;
import org.chromium.chrome.browser.share.ShareSheetCoordinator;
import org.chromium.content_public.browser.UiThreadTaskTraits; import org.chromium.content_public.browser.UiThreadTaskTraits;
import org.chromium.mojo.system.MojoResult; import org.chromium.mojo.system.MojoResult;
import org.chromium.webshare.mojom.ShareError; import org.chromium.webshare.mojom.ShareError;
...@@ -54,7 +54,7 @@ public class SharedFileCollator implements Callback<Integer> { ...@@ -54,7 +54,7 @@ public class SharedFileCollator implements Callback<Integer> {
PostTask.postTask(UiThreadTaskTraits.DEFAULT, () -> { PostTask.postTask(UiThreadTaskTraits.DEFAULT, () -> {
if (result == MojoResult.OK) { if (result == MojoResult.OK) {
ShareHelper.share(mParams); ShareSheetCoordinator.create().share(mParams);
} else { } else {
callback.call(ShareError.INTERNAL_ERROR); callback.call(ShareError.INTERNAL_ERROR);
} }
......
...@@ -24,8 +24,9 @@ import org.chromium.base.task.TaskTraits; ...@@ -24,8 +24,9 @@ import org.chromium.base.task.TaskTraits;
import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.RetryOnFailure; import org.chromium.base.test.util.RetryOnFailure;
import org.chromium.chrome.browser.share.ShareHelper; import org.chromium.chrome.browser.share.ShareHelper;
import org.chromium.chrome.browser.share.ShareMenuActionHandler; import org.chromium.chrome.browser.share.ShareSheetCoordinator;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.ui.RootUiCoordinator;
import org.chromium.chrome.browser.util.ChromeFileProvider; import org.chromium.chrome.browser.util.ChromeFileProvider;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
...@@ -131,6 +132,11 @@ public class ShareIntentTest { ...@@ -131,6 +132,11 @@ public class ShareIntentTest {
public Window getWindow() { public Window getWindow() {
return mActivity.getWindow(); return mActivity.getWindow();
} }
@Override
public ActivityTabProvider getActivityTabProvider() {
return mActivity.getActivityTabProvider();
}
} }
@Test @Test
...@@ -143,10 +149,12 @@ public class ShareIntentTest { ...@@ -143,10 +149,12 @@ public class ShareIntentTest {
// package and class names do not matter. // package and class names do not matter.
return new MockChromeActivity(mActivityTestRule.getActivity()); return new MockChromeActivity(mActivityTestRule.getActivity());
}); });
RootUiCoordinator rootUiCoordinator = TestThreadUtils.runOnUiThreadBlocking(
() -> { return new RootUiCoordinator(mockActivity); });
ShareHelper.setLastShareComponentName( ShareHelper.setLastShareComponentName(
new ComponentName("test.package", "test.activity"), null); new ComponentName("test.package", "test.activity"), null);
// Skips the capture of screenshot and notifies with an empty file. // Skips the capture of screenshot and notifies with an empty file.
ShareMenuActionHandler.setScreenshotCaptureSkippedForTesting(true); ShareSheetCoordinator.setScreenshotCaptureSkippedForTesting(true);
WindowAndroid window = TestThreadUtils.runOnUiThreadBlocking(() -> { WindowAndroid window = TestThreadUtils.runOnUiThreadBlocking(() -> {
return new WindowAndroid(mActivityTestRule.getActivity()) { return new WindowAndroid(mActivityTestRule.getActivity()) {
...@@ -160,7 +168,8 @@ public class ShareIntentTest { ...@@ -160,7 +168,8 @@ public class ShareIntentTest {
() -> { mockActivity.getActivityTab().updateWindowAndroid(window); }); () -> { mockActivity.getActivityTab().updateWindowAndroid(window); });
TestThreadUtils.runOnUiThreadBlocking( TestThreadUtils.runOnUiThreadBlocking(
() -> mockActivity.onShareMenuItemSelected( ()
-> rootUiCoordinator.onShareMenuItemSelected(
true /* shareDirectly */, false /* isIncognito */)); true /* shareDirectly */, false /* isIncognito */));
mockActivity.waitForFileCheck(); mockActivity.waitForFileCheck();
...@@ -175,6 +184,6 @@ public class ShareIntentTest { ...@@ -175,6 +184,6 @@ public class ShareIntentTest {
@After @After
public void tearDown() { public void tearDown() {
ShareMenuActionHandler.setScreenshotCaptureSkippedForTesting(false); ShareSheetCoordinator.setScreenshotCaptureSkippedForTesting(false);
} }
} }
...@@ -18,7 +18,7 @@ import org.chromium.base.test.util.CommandLineFlags; ...@@ -18,7 +18,7 @@ import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.MetricsUtils.HistogramDelta; import org.chromium.base.test.util.MetricsUtils.HistogramDelta;
import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.share.ShareMenuActionHandler.ShareMenuActionDelegate; import org.chromium.chrome.browser.share.ShareSheetMediator.ShareSheetDelegate;
import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeActivityTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.components.ui_metrics.CanonicalURLResult; import org.chromium.components.ui_metrics.CanonicalURLResult;
...@@ -34,7 +34,7 @@ import java.util.concurrent.atomic.AtomicReference; ...@@ -34,7 +34,7 @@ import java.util.concurrent.atomic.AtomicReference;
*/ */
@RunWith(ChromeJUnit4ClassRunner.class) @RunWith(ChromeJUnit4ClassRunner.class)
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
public class ShareMenuActionHandlerIntegrationTest { public class ShareSheetMediatorIntegrationTest {
private static final String PAGE_WITH_HTTPS_CANONICAL_URL = private static final String PAGE_WITH_HTTPS_CANONICAL_URL =
"/chrome/test/data/android/share/link_share_https_canonical.html"; "/chrome/test/data/android/share/link_share_https_canonical.html";
private static final String PAGE_WITH_HTTP_CANONICAL_URL = private static final String PAGE_WITH_HTTP_CANONICAL_URL =
...@@ -99,7 +99,7 @@ public class ShareMenuActionHandlerIntegrationTest { ...@@ -99,7 +99,7 @@ public class ShareMenuActionHandlerIntegrationTest {
throws IllegalArgumentException, TimeoutException { throws IllegalArgumentException, TimeoutException {
mActivityTestRule.loadUrl(pageUrl); mActivityTestRule.loadUrl(pageUrl);
HistogramDelta urlResultDelta = new HistogramDelta( HistogramDelta urlResultDelta = new HistogramDelta(
ShareMenuActionHandler.CANONICAL_URL_RESULT_HISTOGRAM, expectedUrlResult); ShareSheetMediator.CANONICAL_URL_RESULT_HISTOGRAM, expectedUrlResult);
ShareParams params = triggerShare(); ShareParams params = triggerShare();
Assert.assertEquals(expectedShareUrl, params.getUrl()); Assert.assertEquals(expectedShareUrl, params.getUrl());
Assert.assertEquals(1, urlResultDelta.getDelta()); Assert.assertEquals(1, urlResultDelta.getDelta());
...@@ -109,7 +109,7 @@ public class ShareMenuActionHandlerIntegrationTest { ...@@ -109,7 +109,7 @@ public class ShareMenuActionHandlerIntegrationTest {
final CallbackHelper helper = new CallbackHelper(); final CallbackHelper helper = new CallbackHelper();
final AtomicReference<ShareParams> paramsRef = new AtomicReference<>(); final AtomicReference<ShareParams> paramsRef = new AtomicReference<>();
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
ShareMenuActionDelegate delegate = new ShareMenuActionDelegate() { ShareSheetDelegate delegate = new ShareSheetDelegate() {
@Override @Override
void share(ShareParams params) { void share(ShareParams params) {
paramsRef.set(params); paramsRef.set(params);
...@@ -117,8 +117,7 @@ public class ShareMenuActionHandlerIntegrationTest { ...@@ -117,8 +117,7 @@ public class ShareMenuActionHandlerIntegrationTest {
} }
}; };
new ShareMenuActionHandler(delegate).onShareMenuItemSelected( new ShareSheetMediator(delegate).onShareSelected(mActivityTestRule.getActivity(),
mActivityTestRule.getActivity(),
mActivityTestRule.getActivity().getActivityTab(), false, false); mActivityTestRule.getActivity().getActivityTab(), false, false);
}); });
helper.waitForCallback(0); helper.waitForCallback(0);
......
...@@ -23,10 +23,10 @@ import org.chromium.content_public.browser.test.util.TestThreadUtils; ...@@ -23,10 +23,10 @@ import org.chromium.content_public.browser.test.util.TestThreadUtils;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
/** /**
* Tests (requiring native) of the ShareMenuActionHandler. * Tests (requiring native) of the ShareSheetMediator.
*/ */
@RunWith(BaseJUnit4ClassRunner.class) @RunWith(BaseJUnit4ClassRunner.class)
public class ShareMenuActionHandlerTest { public class ShareSheetMediatorTest {
@Rule @Rule
public final ChromeBrowserTestRule mBrowserTestRule = new ChromeBrowserTestRule(); public final ChromeBrowserTestRule mBrowserTestRule = new ChromeBrowserTestRule();
...@@ -43,37 +43,37 @@ public class ShareMenuActionHandlerTest { ...@@ -43,37 +43,37 @@ public class ShareMenuActionHandlerTest {
mSadTabRule.setTab(mockTab); mSadTabRule.setTab(mockTab);
// Null webContents: // Null webContents:
Assert.assertFalse(ShareMenuActionHandler.shouldFetchCanonicalUrl(mockTab)); Assert.assertFalse(ShareSheetMediator.shouldFetchCanonicalUrl(mockTab));
// Null render frame: // Null render frame:
mockTab.webContents = mockWebContents; mockTab.webContents = mockWebContents;
Assert.assertFalse(ShareMenuActionHandler.shouldFetchCanonicalUrl(mockTab)); Assert.assertFalse(ShareSheetMediator.shouldFetchCanonicalUrl(mockTab));
// Invalid/empty URL: // Invalid/empty URL:
mockWebContents.renderFrameHost = mockRenderFrameHost; mockWebContents.renderFrameHost = mockRenderFrameHost;
Assert.assertFalse(ShareMenuActionHandler.shouldFetchCanonicalUrl(mockTab)); Assert.assertFalse(ShareSheetMediator.shouldFetchCanonicalUrl(mockTab));
// Disabled if showing error page. // Disabled if showing error page.
mockTab.isShowingErrorPage = true; mockTab.isShowingErrorPage = true;
Assert.assertFalse(ShareMenuActionHandler.shouldFetchCanonicalUrl(mockTab)); Assert.assertFalse(ShareSheetMediator.shouldFetchCanonicalUrl(mockTab));
mockTab.isShowingErrorPage = false; mockTab.isShowingErrorPage = false;
// Disabled if showing interstitial page. // Disabled if showing interstitial page.
mockTab.isShowingInterstitialPage = true; mockTab.isShowingInterstitialPage = true;
Assert.assertFalse(ShareMenuActionHandler.shouldFetchCanonicalUrl(mockTab)); Assert.assertFalse(ShareSheetMediator.shouldFetchCanonicalUrl(mockTab));
mockTab.isShowingInterstitialPage = false; mockTab.isShowingInterstitialPage = false;
// Disabled if showing sad tab page. // Disabled if showing sad tab page.
mSadTabRule.show(true); mSadTabRule.show(true);
Assert.assertFalse(ShareMenuActionHandler.shouldFetchCanonicalUrl(mockTab)); Assert.assertFalse(ShareSheetMediator.shouldFetchCanonicalUrl(mockTab));
mSadTabRule.show(false); mSadTabRule.show(false);
} }
@Test @Test
@SmallTest @SmallTest
public void testGetUrlToShare() { public void testGetUrlToShare() {
Assert.assertNull(ShareMenuActionHandler.getUrlToShare(null, null)); Assert.assertNull(ShareSheetMediator.getUrlToShare(null, null));
Assert.assertEquals("", ShareMenuActionHandler.getUrlToShare("", null)); Assert.assertEquals("", ShareSheetMediator.getUrlToShare("", null));
final String httpUrl = "http://blah.com"; final String httpUrl = "http://blah.com";
final String otherHttpUrl = "http://eek.com"; final String otherHttpUrl = "http://eek.com";
...@@ -83,21 +83,21 @@ public class ShareMenuActionHandlerTest { ...@@ -83,21 +83,21 @@ public class ShareMenuActionHandlerTest {
final String contentUrl = "content://eek.com"; final String contentUrl = "content://eek.com";
// HTTP Display URL, HTTP Canonical URL -> HTTP Display URL // HTTP Display URL, HTTP Canonical URL -> HTTP Display URL
Assert.assertEquals(httpUrl, ShareMenuActionHandler.getUrlToShare(httpUrl, otherHttpUrl)); Assert.assertEquals(httpUrl, ShareSheetMediator.getUrlToShare(httpUrl, otherHttpUrl));
// HTTP Display URL, HTTPS Canonical URL -> HTTP Display URL // HTTP Display URL, HTTPS Canonical URL -> HTTP Display URL
Assert.assertEquals(httpUrl, ShareMenuActionHandler.getUrlToShare(httpUrl, httpsUrl)); Assert.assertEquals(httpUrl, ShareSheetMediator.getUrlToShare(httpUrl, httpsUrl));
// HTTPS Display URL, HTTP Canonical URL -> HTTP Canonical URL // HTTPS Display URL, HTTP Canonical URL -> HTTP Canonical URL
Assert.assertEquals(httpUrl, ShareMenuActionHandler.getUrlToShare(httpsUrl, httpUrl)); Assert.assertEquals(httpUrl, ShareSheetMediator.getUrlToShare(httpsUrl, httpUrl));
// HTTPS Display URL, HTTPS Canonical URL -> HTTPS Canonical URL // HTTPS Display URL, HTTPS Canonical URL -> HTTPS Canonical URL
Assert.assertEquals(httpsUrl, ShareMenuActionHandler.getUrlToShare(httpsUrl, httpsUrl)); Assert.assertEquals(httpsUrl, ShareSheetMediator.getUrlToShare(httpsUrl, httpsUrl));
Assert.assertEquals( Assert.assertEquals(
otherHttpsUrl, ShareMenuActionHandler.getUrlToShare(httpsUrl, otherHttpsUrl)); otherHttpsUrl, ShareSheetMediator.getUrlToShare(httpsUrl, otherHttpsUrl));
// HTTPS Display URL, FTP URL -> HTTPS Display URL // HTTPS Display URL, FTP URL -> HTTPS Display URL
Assert.assertEquals(httpsUrl, ShareMenuActionHandler.getUrlToShare(httpsUrl, ftpUrl)); Assert.assertEquals(httpsUrl, ShareSheetMediator.getUrlToShare(httpsUrl, ftpUrl));
// HTTPS Display URL, Content URL -> HTTPS Display URL // HTTPS Display URL, Content URL -> HTTPS Display URL
Assert.assertEquals(httpsUrl, ShareMenuActionHandler.getUrlToShare(httpsUrl, contentUrl)); Assert.assertEquals(httpsUrl, ShareSheetMediator.getUrlToShare(httpsUrl, contentUrl));
} }
private static class MockUrlTab extends MockTab { private static class MockUrlTab extends MockTab {
......
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