Commit 587eff93 authored by Ted Choc's avatar Ted Choc Committed by Commit Bot

Make cancelling a webshare request more reliable.

When triggering a share intent chooser, use startActivityForResult as it
allows Chrome to receive a callback when the activity finishes and can
propagate the cancel much sooner.

This required swapping out Activity for WindowAndroid in the share API,
so it is largely a mechanical swap in the various places triggering share.

BUG=636274

Change-Id: Id3628e65757ca54713a57eefcd47efec24fc65a4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1832589Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Commit-Queue: Ted Choc <tedchoc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#708050}
parent 810787b4
...@@ -539,7 +539,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { ...@@ -539,7 +539,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
} else if (itemId == R.id.contextmenu_share_link) { } else if (itemId == R.id.contextmenu_share_link) {
ContextMenuUma.record(params, ContextMenuUma.Action.SHARE_LINK); ContextMenuUma.record(params, ContextMenuUma.Action.SHARE_LINK);
ShareParams linkShareParams = ShareParams linkShareParams =
new ShareParams.Builder(helper.getActivity(), params.getUrl(), params.getUrl()) new ShareParams.Builder(helper.getWindow(), params.getUrl(), params.getUrl())
.setShareDirectly(false) .setShareDirectly(false)
.setSaveLastUsed(true) .setSaveLastUsed(true)
.build(); .build();
......
...@@ -47,6 +47,7 @@ public class ContextMenuHelper implements OnCreateContextMenuListener { ...@@ -47,6 +47,7 @@ public class ContextMenuHelper implements OnCreateContextMenuListener {
private ContextMenuPopulator mPopulator; private ContextMenuPopulator mPopulator;
private ContextMenuParams mCurrentContextMenuParams; private ContextMenuParams mCurrentContextMenuParams;
private WindowAndroid mWindow;
private Activity mActivity; private Activity mActivity;
private Callback<Integer> mCallback; private Callback<Integer> mCallback;
private Runnable mOnMenuShown; private Runnable mOnMenuShown;
...@@ -93,6 +94,13 @@ public class ContextMenuHelper implements OnCreateContextMenuListener { ...@@ -93,6 +94,13 @@ public class ContextMenuHelper implements OnCreateContextMenuListener {
return mActivity; return mActivity;
} }
/**
* @return The window associated with the context menu helper.
*/
protected WindowAndroid getWindow() {
return mWindow;
}
/** /**
* @param populator A {@link ContextMenuPopulator} that is responsible for managing and showing * @param populator A {@link ContextMenuPopulator} that is responsible for managing and showing
* context menus. * context menus.
...@@ -122,6 +130,7 @@ public class ContextMenuHelper implements OnCreateContextMenuListener { ...@@ -122,6 +130,7 @@ public class ContextMenuHelper implements OnCreateContextMenuListener {
} }
mCurrentContextMenuParams = params; mCurrentContextMenuParams = params;
mWindow = windowAndroid;
mActivity = windowAndroid.getActivity().get(); mActivity = windowAndroid.getActivity().get();
mCallback = (result) -> { mCallback = (result) -> {
mSelectedItemBeforeDismiss = true; mSelectedItemBeforeDismiss = true;
...@@ -152,7 +161,7 @@ public class ContextMenuHelper implements OnCreateContextMenuListener { ...@@ -152,7 +161,7 @@ public class ContextMenuHelper implements OnCreateContextMenuListener {
final RevampedContextMenuCoordinator menuCoordinator = final RevampedContextMenuCoordinator menuCoordinator =
new RevampedContextMenuCoordinator( new RevampedContextMenuCoordinator(
topContentOffsetPx, this::shareImageWithLastShareComponent); topContentOffsetPx, this::shareImageWithLastShareComponent);
menuCoordinator.displayMenu(mActivity, mCurrentContextMenuParams, items, mCallback, menuCoordinator.displayMenu(mWindow, mCurrentContextMenuParams, items, mCallback,
mOnMenuShown, mOnMenuClosed); mOnMenuShown, mOnMenuClosed);
if (sRevampedContextMenuShownCallback != null) { if (sRevampedContextMenuShownCallback != null) {
sRevampedContextMenuShownCallback.onResult(menuCoordinator); sRevampedContextMenuShownCallback.onResult(menuCoordinator);
...@@ -207,7 +216,7 @@ public class ContextMenuHelper implements OnCreateContextMenuListener { ...@@ -207,7 +216,7 @@ public class ContextMenuHelper implements OnCreateContextMenuListener {
*/ */
public void searchWithGoogleLens(boolean isIncognito) { public void searchWithGoogleLens(boolean isIncognito) {
retrieveImage((Uri imageUri) -> { retrieveImage((Uri imageUri) -> {
ShareHelper.shareImageWithGoogleLens(mActivity, imageUri, isIncognito); ShareHelper.shareImageWithGoogleLens(mWindow, imageUri, isIncognito);
}); });
} }
...@@ -225,7 +234,7 @@ public class ContextMenuHelper implements OnCreateContextMenuListener { ...@@ -225,7 +234,7 @@ public class ContextMenuHelper implements OnCreateContextMenuListener {
* it will use the right activity set when the menu was displayed. * it will use the right activity set when the menu was displayed.
*/ */
void shareImage() { void shareImage() {
retrieveImage((Uri imageUri) -> { ShareHelper.shareImage(mActivity, null, imageUri); }); retrieveImage((Uri imageUri) -> { ShareHelper.shareImage(mWindow, null, imageUri); });
} }
/** /**
...@@ -233,8 +242,7 @@ public class ContextMenuHelper implements OnCreateContextMenuListener { ...@@ -233,8 +242,7 @@ public class ContextMenuHelper implements OnCreateContextMenuListener {
*/ */
private void shareImageWithLastShareComponent() { private void shareImageWithLastShareComponent() {
retrieveImage((Uri imageUri) -> { retrieveImage((Uri imageUri) -> {
ShareHelper.shareImage( ShareHelper.shareImage(mWindow, ShareHelper.getLastShareComponentName(null), imageUri);
mActivity, ShareHelper.getLastShareComponentName(null), imageUri);
}); });
} }
...@@ -290,8 +298,8 @@ public class ContextMenuHelper implements OnCreateContextMenuListener { ...@@ -290,8 +298,8 @@ public class ContextMenuHelper implements OnCreateContextMenuListener {
return; return;
} }
ContextMenuUi menuUi = new PlatformContextMenuUi(menu); ContextMenuUi menuUi = new PlatformContextMenuUi(menu);
menuUi.displayMenu(mActivity, mCurrentContextMenuParams, items, mCallback, mOnMenuShown, menuUi.displayMenu(
mOnMenuClosed); mWindow, mCurrentContextMenuParams, items, mCallback, mOnMenuShown, mOnMenuClosed);
} }
private void recordTimeToTakeActionHistogram(boolean selectedItem) { private void recordTimeToTakeActionHistogram(boolean selectedItem) {
......
...@@ -4,10 +4,10 @@ ...@@ -4,10 +4,10 @@
package org.chromium.chrome.browser.contextmenu; package org.chromium.chrome.browser.contextmenu;
import android.app.Activity;
import android.util.Pair; import android.util.Pair;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.ui.base.WindowAndroid;
import java.util.List; import java.util.List;
...@@ -18,7 +18,7 @@ import java.util.List; ...@@ -18,7 +18,7 @@ import java.util.List;
public interface ContextMenuUi { public interface ContextMenuUi {
/** /**
* Shows the Context Menu in Chrome. * Shows the Context Menu in Chrome.
* @param activity Used to inflate the context menu. * @param window Used to inflate the context menu.
* @param params The current parameters for the the context menu. * @param params The current parameters for the the context menu.
* @param items The list of items that need to be displayed in the context menu items. This is * @param items The list of items that need to be displayed in the context menu items. This is
* taken from the return value of {@link ContextMenuPopulator#buildContextMenu( * taken from the return value of {@link ContextMenuPopulator#buildContextMenu(
...@@ -32,7 +32,7 @@ public interface ContextMenuUi { ...@@ -32,7 +32,7 @@ public interface ContextMenuUi {
* clean up. Boolean here should be true if the menu is closed as a result * clean up. Boolean here should be true if the menu is closed as a result
* of clicking an item and false if the menu is abandoned by the user. * of clicking an item and false if the menu is abandoned by the user.
*/ */
void displayMenu(Activity activity, ContextMenuParams params, void displayMenu(WindowAndroid window, ContextMenuParams params,
List<Pair<Integer, List<ContextMenuItem>>> items, Callback<Integer> onItemClicked, List<Pair<Integer, List<ContextMenuItem>>> items, Callback<Integer> onItemClicked,
Runnable onMenuShown, Callback<Boolean> onMenuClosed); Runnable onMenuShown, Callback<Boolean> onMenuClosed);
} }
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
package org.chromium.chrome.browser.contextmenu; package org.chromium.chrome.browser.contextmenu;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Pair; import android.util.Pair;
...@@ -12,6 +11,7 @@ import android.view.ContextMenu; ...@@ -12,6 +11,7 @@ import android.view.ContextMenu;
import android.view.MenuItem; import android.view.MenuItem;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.ui.base.WindowAndroid;
import java.util.List; import java.util.List;
...@@ -27,12 +27,13 @@ public class PlatformContextMenuUi implements ContextMenuUi { ...@@ -27,12 +27,13 @@ public class PlatformContextMenuUi implements ContextMenuUi {
} }
@Override @Override
public void displayMenu(Activity activity, ContextMenuParams params, public void displayMenu(WindowAndroid window, ContextMenuParams params,
List<Pair<Integer, List<ContextMenuItem>>> itemGroups, final Callback<Integer> listener, List<Pair<Integer, List<ContextMenuItem>>> itemGroups, final Callback<Integer> listener,
Runnable onMenuShown, Callback<Boolean> onMenuClosed) { Runnable onMenuShown, Callback<Boolean> onMenuClosed) {
Context context = window.getContext().get();
String headerText = ChromeContextMenuPopulator.createHeaderText(params); String headerText = ChromeContextMenuPopulator.createHeaderText(params);
if (!TextUtils.isEmpty(headerText)) { if (!TextUtils.isEmpty(headerText)) {
setHeaderText(activity, mMenu, headerText); setHeaderText(context, mMenu, headerText);
} }
MenuItem.OnMenuItemClickListener menuListener = new MenuItem.OnMenuItemClickListener() { MenuItem.OnMenuItemClickListener menuListener = new MenuItem.OnMenuItemClickListener() {
...@@ -46,7 +47,7 @@ public class PlatformContextMenuUi implements ContextMenuUi { ...@@ -46,7 +47,7 @@ public class PlatformContextMenuUi implements ContextMenuUi {
List<ContextMenuItem> group = itemGroups.get(groupIndex).second; List<ContextMenuItem> group = itemGroups.get(groupIndex).second;
for (int itemIndex = 0; itemIndex < group.size(); itemIndex++) { for (int itemIndex = 0; itemIndex < group.size(); itemIndex++) {
ContextMenuItem item = group.get(itemIndex); ContextMenuItem item = group.get(itemIndex);
MenuItem menuItem = mMenu.add(0, item.getMenuId(), 0, item.getTitle(activity)); MenuItem menuItem = mMenu.add(0, item.getMenuId(), 0, item.getTitle(context));
menuItem.setOnMenuItemClickListener(menuListener); menuItem.setOnMenuItemClickListener(menuListener);
} }
} }
......
...@@ -20,6 +20,7 @@ import org.chromium.chrome.R; ...@@ -20,6 +20,7 @@ import org.chromium.chrome.R;
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.ui.widget.ContextMenuDialog; import org.chromium.chrome.browser.ui.widget.ContextMenuDialog;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.modelutil.MVCListAdapter.ListItem; import org.chromium.ui.modelutil.MVCListAdapter.ListItem;
import org.chromium.ui.modelutil.MVCListAdapter.ModelList; import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
import org.chromium.ui.modelutil.ModelListAdapter; import org.chromium.ui.modelutil.ModelListAdapter;
...@@ -66,10 +67,11 @@ public class RevampedContextMenuCoordinator implements ContextMenuUi { ...@@ -66,10 +67,11 @@ public class RevampedContextMenuCoordinator implements ContextMenuUi {
} }
@Override @Override
public void displayMenu(final Activity activity, ContextMenuParams params, public void displayMenu(final WindowAndroid window, ContextMenuParams params,
List<Pair<Integer, List<ContextMenuItem>>> items, Callback<Integer> onItemClicked, List<Pair<Integer, List<ContextMenuItem>>> items, Callback<Integer> onItemClicked,
final Runnable onMenuShown, final Callback<Boolean> onMenuClosed) { final Runnable onMenuShown, final Callback<Boolean> onMenuClosed) {
mOnMenuClosed = onMenuClosed; mOnMenuClosed = onMenuClosed;
Activity activity = window.getActivity().get();
final float density = activity.getResources().getDisplayMetrics().density; final float density = activity.getResources().getDisplayMetrics().density;
final float touchPointXPx = params.getTriggeringTouchXDp() * density; final float touchPointXPx = params.getTriggeringTouchXDp() * density;
final float touchPointYPx = params.getTriggeringTouchYDp() * density; final float touchPointYPx = params.getTriggeringTouchYDp() * density;
...@@ -83,7 +85,7 @@ public class RevampedContextMenuCoordinator implements ContextMenuUi { ...@@ -83,7 +85,7 @@ public class RevampedContextMenuCoordinator implements ContextMenuUi {
mHeaderCoordinator = new RevampedContextMenuHeaderCoordinator(activity, params); mHeaderCoordinator = new RevampedContextMenuHeaderCoordinator(activity, params);
// The Integer here specifies the {@link ListItemType}. // The Integer here specifies the {@link ListItemType}.
ModelList listItems = getItemList(activity, items, params); ModelList listItems = getItemList(window, items, params);
ModelListAdapter adapter = new ModelListAdapter(listItems) { ModelListAdapter adapter = new ModelListAdapter(listItems) {
@Override @Override
...@@ -167,8 +169,9 @@ public class RevampedContextMenuCoordinator implements ContextMenuUi { ...@@ -167,8 +169,9 @@ public class RevampedContextMenuCoordinator implements ContextMenuUi {
} }
@VisibleForTesting @VisibleForTesting
ModelList getItemList(Activity activity, List<Pair<Integer, List<ContextMenuItem>>> items, ModelList getItemList(WindowAndroid window, List<Pair<Integer, List<ContextMenuItem>>> items,
ContextMenuParams params) { ContextMenuParams params) {
Activity activity = window.getActivity().get();
ModelList itemList = new ModelList(); ModelList itemList = new ModelList();
// TODO(sinansahin): We should be able to remove this conversion once we can get the items // TODO(sinansahin): We should be able to remove this conversion once we can get the items
...@@ -196,7 +199,7 @@ public class RevampedContextMenuCoordinator implements ContextMenuUi { ...@@ -196,7 +199,7 @@ public class RevampedContextMenuCoordinator implements ContextMenuUi {
.with(RevampedContextMenuShareItemProperties.CONTENT_DESC, .with(RevampedContextMenuShareItemProperties.CONTENT_DESC,
shareInfo.second) shareInfo.second)
.with(RevampedContextMenuShareItemProperties.CLICK_LISTENER, .with(RevampedContextMenuShareItemProperties.CLICK_LISTENER,
getShareItemClickListener(activity, shareItem, params)) getShareItemClickListener(window, shareItem, params))
.build(); .build();
itemList.add(new ListItem(ListItemType.CONTEXT_MENU_SHARE_ITEM, itemModel)); itemList.add(new ListItem(ListItemType.CONTEXT_MENU_SHARE_ITEM, itemModel));
} else { } else {
...@@ -216,7 +219,7 @@ public class RevampedContextMenuCoordinator implements ContextMenuUi { ...@@ -216,7 +219,7 @@ public class RevampedContextMenuCoordinator implements ContextMenuUi {
} }
private View.OnClickListener getShareItemClickListener( private View.OnClickListener getShareItemClickListener(
Activity activity, ShareContextMenuItem item, ContextMenuParams params) { WindowAndroid window, ShareContextMenuItem item, ContextMenuParams params) {
return (v) -> { return (v) -> {
ChromeContextMenuPopulator.ContextMenuUma.record(params, ChromeContextMenuPopulator.ContextMenuUma.record(params,
item.isShareLink() item.isShareLink()
...@@ -226,7 +229,7 @@ public class RevampedContextMenuCoordinator implements ContextMenuUi { ...@@ -226,7 +229,7 @@ public class RevampedContextMenuCoordinator implements ContextMenuUi {
mDialog.dismiss(); mDialog.dismiss();
if (item.isShareLink()) { if (item.isShareLink()) {
final ShareParams shareParams = final ShareParams shareParams =
new ShareParams.Builder(activity, params.getUrl(), params.getUrl()) new ShareParams.Builder(window, params.getUrl(), params.getUrl())
.setShareDirectly(true) .setShareDirectly(true)
.setSaveLastUsed(false) .setSaveLastUsed(false)
.build(); .build();
......
...@@ -4,8 +4,6 @@ ...@@ -4,8 +4,6 @@
package org.chromium.chrome.browser.offlinepages; package org.chromium.chrome.browser.offlinepages;
import android.app.Activity;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.chrome.browser.share.ShareParams; import org.chromium.chrome.browser.share.ShareParams;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
...@@ -19,14 +17,12 @@ import java.util.List; ...@@ -19,14 +17,12 @@ import java.util.List;
*/ */
public class GetPagesByNamespaceForLivePageSharingCallback public class GetPagesByNamespaceForLivePageSharingCallback
implements Callback<List<OfflinePageItem>> { implements Callback<List<OfflinePageItem>> {
private Activity mActivity;
private Tab mTab; private Tab mTab;
private Callback<ShareParams> mShareCallback; private Callback<ShareParams> mShareCallback;
private OfflinePageBridge mBridge; private OfflinePageBridge mBridge;
public GetPagesByNamespaceForLivePageSharingCallback(Activity activity, Tab tab, public GetPagesByNamespaceForLivePageSharingCallback(
final Callback<ShareParams> shareCallback, OfflinePageBridge bridge) { Tab tab, final Callback<ShareParams> shareCallback, OfflinePageBridge bridge) {
mActivity = activity;
mTab = tab; mTab = tab;
mShareCallback = shareCallback; mShareCallback = shareCallback;
mBridge = bridge; mBridge = bridge;
...@@ -38,7 +34,7 @@ public class GetPagesByNamespaceForLivePageSharingCallback ...@@ -38,7 +34,7 @@ public class GetPagesByNamespaceForLivePageSharingCallback
// it directly. // it directly.
for (OfflinePageItem item : items) { for (OfflinePageItem item : items) {
if (item.getUrl().equals(mTab.getUrl())) { if (item.getUrl().equals(mTab.getUrl())) {
OfflinePageUtils.sharePublishedPage(item, mActivity, mShareCallback); OfflinePageUtils.sharePublishedPage(item, mTab.getWindowAndroid(), mShareCallback);
return; return;
} }
} }
...@@ -47,6 +43,6 @@ public class GetPagesByNamespaceForLivePageSharingCallback ...@@ -47,6 +43,6 @@ public class GetPagesByNamespaceForLivePageSharingCallback
mBridge.savePage(mTab.getWebContents(), mBridge.savePage(mTab.getWebContents(),
new ClientId(OfflinePageBridge.LIVE_PAGE_SHARING_NAMESPACE, new ClientId(OfflinePageBridge.LIVE_PAGE_SHARING_NAMESPACE,
Integer.toString(mTab.getId())), Integer.toString(mTab.getId())),
new SavePageAndShareCallback(mActivity, mShareCallback, mBridge)); new SavePageAndShareCallback(mTab.getWindowAndroid(), mShareCallback, mBridge));
} }
} }
\ No newline at end of file
...@@ -4,11 +4,10 @@ ...@@ -4,11 +4,10 @@
package org.chromium.chrome.browser.offlinepages; package org.chromium.chrome.browser.offlinepages;
import android.app.Activity;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNative;
import org.chromium.chrome.browser.share.ShareParams; import org.chromium.chrome.browser.share.ShareParams;
import org.chromium.ui.base.WindowAndroid;
/** /**
* This callback will save the state we need when the JNI call is done, and start the next stage of * This callback will save the state we need when the JNI call is done, and start the next stage of
...@@ -17,13 +16,13 @@ import org.chromium.chrome.browser.share.ShareParams; ...@@ -17,13 +16,13 @@ import org.chromium.chrome.browser.share.ShareParams;
public class PublishPageCallback implements Callback<String> { public class PublishPageCallback implements Callback<String> {
private Callback<ShareParams> mShareCallback; private Callback<ShareParams> mShareCallback;
OfflinePageItem mPage; OfflinePageItem mPage;
private Activity mActivity; private WindowAndroid mWindow;
private static final String TAG = "PublishPageCallback"; private static final String TAG = "PublishPageCallback";
/** Create a callback for use when page publishing is completed. */ /** Create a callback for use when page publishing is completed. */
public PublishPageCallback( public PublishPageCallback(
Activity activity, OfflinePageItem page, Callback<ShareParams> shareCallback) { WindowAndroid window, OfflinePageItem page, Callback<ShareParams> shareCallback) {
mActivity = activity; mWindow = window;
mPage = page; mPage = page;
mShareCallback = shareCallback; mShareCallback = shareCallback;
} }
...@@ -43,6 +42,6 @@ public class PublishPageCallback implements Callback<String> { ...@@ -43,6 +42,6 @@ public class PublishPageCallback implements Callback<String> {
mPage.getAccessCount(), mPage.getLastAccessTimeMs(), mPage.getRequestOrigin()); mPage.getAccessCount(), mPage.getLastAccessTimeMs(), mPage.getRequestOrigin());
} }
OfflinePageUtils.publishCompleted(page, mActivity, mShareCallback); OfflinePageUtils.publishCompleted(page, mWindow, mShareCallback);
} }
} }
...@@ -4,24 +4,23 @@ ...@@ -4,24 +4,23 @@
package org.chromium.chrome.browser.offlinepages; package org.chromium.chrome.browser.offlinepages;
import android.app.Activity;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.chrome.browser.share.ShareParams; import org.chromium.chrome.browser.share.ShareParams;
import org.chromium.components.offlinepages.SavePageResult; import org.chromium.components.offlinepages.SavePageResult;
import org.chromium.ui.base.WindowAndroid;
/** /**
* This callback will save get the saved page during live page sharing and share the page if saving * This callback will save get the saved page during live page sharing and share the page if saving
* process succeeds. * process succeeds.
*/ */
public class SavePageAndShareCallback implements OfflinePageBridge.SavePageCallback { public class SavePageAndShareCallback implements OfflinePageBridge.SavePageCallback {
private Activity mActivity; private WindowAndroid mWindow;
private Callback<ShareParams> mShareCallback; private Callback<ShareParams> mShareCallback;
private OfflinePageBridge mBridge; private OfflinePageBridge mBridge;
public SavePageAndShareCallback(Activity activity, final Callback<ShareParams> shareCallback, public SavePageAndShareCallback(WindowAndroid window, final Callback<ShareParams> shareCallback,
OfflinePageBridge bridge) { OfflinePageBridge bridge) {
mActivity = activity; mWindow = window;
mShareCallback = shareCallback; mShareCallback = shareCallback;
mBridge = bridge; mBridge = bridge;
} }
...@@ -35,7 +34,7 @@ public class SavePageAndShareCallback implements OfflinePageBridge.SavePageCallb ...@@ -35,7 +34,7 @@ public class SavePageAndShareCallback implements OfflinePageBridge.SavePageCallb
mBridge.getPageByOfflineId(offlineId, new Callback<OfflinePageItem>() { mBridge.getPageByOfflineId(offlineId, new Callback<OfflinePageItem>() {
@Override @Override
public void onResult(OfflinePageItem page) { public void onResult(OfflinePageItem page) {
OfflinePageUtils.sharePublishedPage(page, mActivity, mShareCallback); OfflinePageUtils.sharePublishedPage(page, mWindow, mShareCallback);
} }
}); });
} }
......
...@@ -24,6 +24,7 @@ import org.chromium.chrome.browser.util.UrlConstants; ...@@ -24,6 +24,7 @@ import org.chromium.chrome.browser.util.UrlConstants;
import org.chromium.components.ui_metrics.CanonicalURLResult; import org.chromium.components.ui_metrics.CanonicalURLResult;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
import org.chromium.net.GURLUtils; import org.chromium.net.GURLUtils;
import org.chromium.ui.base.WindowAndroid;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -86,12 +87,11 @@ public class ShareMenuActionHandler { ...@@ -86,12 +87,11 @@ public class ShareMenuActionHandler {
if (!classesToEnable.isEmpty()) { if (!classesToEnable.isEmpty()) {
OptionalShareTargetsManager.getInstance().enableOptionalShareActivities(activity, OptionalShareTargetsManager.getInstance().enableOptionalShareActivities(activity,
classesToEnable, classesToEnable, () -> triggerShare(currentTab, shareDirectly, isIncognito));
() -> triggerShare(activity, currentTab, shareDirectly, isIncognito));
return; return;
} }
triggerShare(activity, currentTab, shareDirectly, isIncognito); triggerShare(currentTab, shareDirectly, isIncognito);
} }
@VisibleForTesting @VisibleForTesting
...@@ -154,18 +154,19 @@ public class ShareMenuActionHandler { ...@@ -154,18 +154,19 @@ public class ShareMenuActionHandler {
} }
} }
private void triggerShare(final Activity activity, final Tab currentTab, private void triggerShare(
final boolean shareDirectly, boolean isIncognito) { final Tab currentTab, final boolean shareDirectly, boolean isIncognito) {
ScreenshotTabObserver tabObserver = ScreenshotTabObserver.from(currentTab); ScreenshotTabObserver tabObserver = ScreenshotTabObserver.from(currentTab);
if (tabObserver != null) { if (tabObserver != null) {
tabObserver.onActionPerformedAfterScreenshot( tabObserver.onActionPerformedAfterScreenshot(
ScreenshotTabObserver.SCREENSHOT_ACTION_SHARE); ScreenshotTabObserver.SCREENSHOT_ACTION_SHARE);
} }
OfflinePageUtils.maybeShareOfflinePage(activity, currentTab, (ShareParams p) -> { OfflinePageUtils.maybeShareOfflinePage(currentTab, (ShareParams p) -> {
if (p != null) { if (p != null) {
mDelegate.share(p); mDelegate.share(p);
} else { } else {
WindowAndroid window = currentTab.getWindowAndroid();
// Could not share as an offline page. // Could not share as an offline page.
if (shouldFetchCanonicalUrl(currentTab)) { if (shouldFetchCanonicalUrl(currentTab)) {
WebContents webContents = currentTab.getWebContents(); WebContents webContents = currentTab.getWebContents();
...@@ -176,12 +177,12 @@ public class ShareMenuActionHandler { ...@@ -176,12 +177,12 @@ public class ShareMenuActionHandler {
public void onResult(String result) { public void onResult(String result) {
logCanonicalUrlResult(visibleUrl, result); logCanonicalUrlResult(visibleUrl, result);
triggerShareWithCanonicalUrlResolved(activity, webContents, title, triggerShareWithCanonicalUrlResolved(window, webContents, title,
visibleUrl, result, shareDirectly, isIncognito); visibleUrl, result, shareDirectly, isIncognito);
} }
}); });
} else { } else {
triggerShareWithCanonicalUrlResolved(activity, currentTab.getWebContents(), triggerShareWithCanonicalUrlResolved(window, currentTab.getWebContents(),
currentTab.getTitle(), currentTab.getUrl(), null, shareDirectly, currentTab.getTitle(), currentTab.getUrl(), null, shareDirectly,
isIncognito); isIncognito);
} }
...@@ -189,17 +190,16 @@ public class ShareMenuActionHandler { ...@@ -189,17 +190,16 @@ public class ShareMenuActionHandler {
}); });
} }
private void triggerShareWithCanonicalUrlResolved(final Activity mainActivity, private void triggerShareWithCanonicalUrlResolved(final WindowAndroid window,
final WebContents webContents, final String title, final String visibleUrl, final WebContents webContents, final String title, final String visibleUrl,
final String canonicalUrl, final boolean shareDirectly, boolean isIncognito) { final String canonicalUrl, final boolean shareDirectly, boolean isIncognito) {
// Share an empty blockingUri in place of screenshot file. The file ready notification is // Share an empty blockingUri in place of screenshot file. The file ready notification is
// sent by onScreenshotReady call below when the file is written. // sent by onScreenshotReady call below when the file is written.
final Uri blockingUri = (isIncognito || webContents == null) final Uri blockingUri = (isIncognito || webContents == null)
? null ? null
: ChromeFileProvider.generateUriAndBlockAccess(mainActivity); : ChromeFileProvider.generateUriAndBlockAccess();
ShareParams.Builder builder = ShareParams.Builder builder =
new ShareParams new ShareParams.Builder(window, title, getUrlToShare(visibleUrl, canonicalUrl))
.Builder(mainActivity, title, getUrlToShare(visibleUrl, canonicalUrl))
.setShareDirectly(shareDirectly) .setShareDirectly(shareDirectly)
.setSaveLastUsed(!shareDirectly) .setSaveLastUsed(!shareDirectly)
.setScreenshotUri(blockingUri); .setScreenshotUri(blockingUri);
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
package org.chromium.chrome.browser.share; package org.chromium.chrome.browser.share;
import android.app.Activity;
import android.net.Uri; import android.net.Uri;
import android.text.TextUtils; import android.text.TextUtils;
...@@ -13,6 +12,7 @@ import androidx.annotation.Nullable; ...@@ -13,6 +12,7 @@ import androidx.annotation.Nullable;
import org.chromium.chrome.browser.share.ShareHelper.TargetChosenCallback; import org.chromium.chrome.browser.share.ShareHelper.TargetChosenCallback;
import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
import org.chromium.ui.base.WindowAndroid;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -29,8 +29,8 @@ public class ShareParams { ...@@ -29,8 +29,8 @@ public class ShareParams {
/** Whether to save the chosen activity for future direct sharing. */ /** Whether to save the chosen activity for future direct sharing. */
private final boolean mSaveLastUsed; private final boolean mSaveLastUsed;
/** The activity that is used to access package manager. */ /** The window that triggered the share action. */
private final Activity mActivity; private final WindowAndroid mWindow;
/** The title of the page to be shared. */ /** The title of the page to be shared. */
private final String mTitle; private final String mTitle;
...@@ -69,14 +69,14 @@ public class ShareParams { ...@@ -69,14 +69,14 @@ public class ShareParams {
@Nullable @Nullable
private final Runnable mOnDialogDismissed; private final Runnable mOnDialogDismissed;
private ShareParams(boolean shareDirectly, boolean saveLastUsed, Activity activity, private ShareParams(boolean shareDirectly, boolean saveLastUsed, WindowAndroid window,
String title, String text, String url, @Nullable String fileContentType, String title, String text, String url, @Nullable String fileContentType,
@Nullable ArrayList<Uri> fileUris, @Nullable Uri offlineUri, @Nullable ArrayList<Uri> fileUris, @Nullable Uri offlineUri,
@Nullable Uri screenshotUri, @Nullable TargetChosenCallback callback, @Nullable Uri screenshotUri, @Nullable TargetChosenCallback callback,
@Nullable String sourcePackageName, @Nullable Runnable onDialogDismissed) { @Nullable String sourcePackageName, @Nullable Runnable onDialogDismissed) {
mShareDirectly = shareDirectly; mShareDirectly = shareDirectly;
mSaveLastUsed = saveLastUsed; mSaveLastUsed = saveLastUsed;
mActivity = activity; mWindow = window;
mTitle = title; mTitle = title;
mText = text; mText = text;
mUrl = url; mUrl = url;
...@@ -105,10 +105,10 @@ public class ShareParams { ...@@ -105,10 +105,10 @@ public class ShareParams {
} }
/** /**
* @return The activity that is used to access package manager. * @return The window that triggered share.
*/ */
public Activity getActivity() { public WindowAndroid getWindow() {
return mActivity; return mWindow;
} }
/** /**
...@@ -191,7 +191,7 @@ public class ShareParams { ...@@ -191,7 +191,7 @@ public class ShareParams {
public static class Builder { public static class Builder {
private boolean mShareDirectly; private boolean mShareDirectly;
private boolean mSaveLastUsed; private boolean mSaveLastUsed;
private Activity mActivity; private WindowAndroid mWindow;
private String mTitle; private String mTitle;
private String mText; private String mText;
private String mUrl; private String mUrl;
...@@ -204,8 +204,8 @@ public class ShareParams { ...@@ -204,8 +204,8 @@ public class ShareParams {
private boolean mIsExternalUrl; private boolean mIsExternalUrl;
private Runnable mOnDialogDismissed; private Runnable mOnDialogDismissed;
public Builder(@NonNull Activity activity, @NonNull String title, @NonNull String url) { public Builder(@NonNull WindowAndroid window, @NonNull String title, @NonNull String url) {
mActivity = activity; mWindow = window;
mUrl = url; mUrl = url;
mTitle = title; mTitle = title;
} }
...@@ -320,7 +320,7 @@ public class ShareParams { ...@@ -320,7 +320,7 @@ public class ShareParams {
mText = mUrl; mText = mUrl;
} }
} }
return new ShareParams(mShareDirectly, mSaveLastUsed, mActivity, mTitle, mText, mUrl, return new ShareParams(mShareDirectly, mSaveLastUsed, mWindow, mTitle, mText, mUrl,
mFileContentType, mFileUris, mOfflineUri, mScreenshotUri, mCallback, mFileContentType, mFileUris, mOfflineUri, mScreenshotUri, mCallback,
mSourcePackageName, mOnDialogDismissed); mSourcePackageName, mOnDialogDismissed);
} }
......
...@@ -42,7 +42,7 @@ import java.util.Set; ...@@ -42,7 +42,7 @@ import java.util.Set;
* third_party/blink/public/mojom/webshare/webshare.mojom. * third_party/blink/public/mojom/webshare/webshare.mojom.
*/ */
public class ShareServiceImpl implements ShareService { public class ShareServiceImpl implements ShareService {
private final Activity mActivity; private final WindowAndroid mWindow;
private static final String TAG = "share"; private static final String TAG = "share";
...@@ -142,7 +142,7 @@ public class ShareServiceImpl implements ShareService { ...@@ -142,7 +142,7 @@ public class ShareServiceImpl implements ShareService {
PostTask.createSequencedTaskRunner(TaskTraits.USER_BLOCKING); PostTask.createSequencedTaskRunner(TaskTraits.USER_BLOCKING);
public ShareServiceImpl(@Nullable WebContents webContents) { public ShareServiceImpl(@Nullable WebContents webContents) {
mActivity = activityFromWebContents(webContents); mWindow = webContents.getTopLevelNativeWindow();
} }
@Override @Override
...@@ -157,7 +157,7 @@ public class ShareServiceImpl implements ShareService { ...@@ -157,7 +157,7 @@ public class ShareServiceImpl implements ShareService {
RecordHistogram.recordEnumeratedHistogram("WebShare.ApiCount", WEBSHARE_METHOD_SHARE, RecordHistogram.recordEnumeratedHistogram("WebShare.ApiCount", WEBSHARE_METHOD_SHARE,
WEBSHARE_METHOD_COUNT); WEBSHARE_METHOD_COUNT);
if (mActivity == null) { if (mWindow.getActivity().get() == null) {
RecordHistogram.recordEnumeratedHistogram("WebShare.ShareOutcome", RecordHistogram.recordEnumeratedHistogram("WebShare.ShareOutcome",
WEBSHARE_OUTCOME_UNKNOWN_FAILURE, WEBSHARE_OUTCOME_COUNT); WEBSHARE_OUTCOME_UNKNOWN_FAILURE, WEBSHARE_OUTCOME_COUNT);
callback.call(ShareError.INTERNAL_ERROR); callback.call(ShareError.INTERNAL_ERROR);
...@@ -180,7 +180,7 @@ public class ShareServiceImpl implements ShareService { ...@@ -180,7 +180,7 @@ public class ShareServiceImpl implements ShareService {
} }
}; };
final ShareParams.Builder paramsBuilder = new ShareParams.Builder(mActivity, title, url.url) final ShareParams.Builder paramsBuilder = new ShareParams.Builder(mWindow, title, url.url)
.setText(text) .setText(text)
.setCallback(innerCallback); .setCallback(innerCallback);
......
...@@ -4,12 +4,14 @@ ...@@ -4,12 +4,14 @@
package org.chromium.chrome.browser; package org.chromium.chrome.browser;
import android.app.Activity;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.Uri; import android.net.Uri;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.support.test.filters.LargeTest; import android.support.test.filters.LargeTest;
import android.view.Window;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
...@@ -28,8 +30,10 @@ import org.chromium.chrome.browser.util.ChromeFileProvider; ...@@ -28,8 +30,10 @@ 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;
import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.ui.base.WindowAndroid;
import java.io.IOException; import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
/** /**
...@@ -66,6 +70,15 @@ public class ShareIntentTest { ...@@ -66,6 +70,15 @@ public class ShareIntentTest {
*/ */
@Override @Override
public void startActivity(Intent intent) { public void startActivity(Intent intent) {
processStartActivityIntent(intent);
}
@Override
public void startActivityForResult(Intent intent, int requestCode) {
processStartActivityIntent(intent);
}
private void processStartActivityIntent(Intent intent) {
final Uri uri = intent.getClipData().getItemAt(0).getUri(); final Uri uri = intent.getClipData().getItemAt(0).getUri();
PostTask.postTask(TaskTraits.BEST_EFFORT_MAY_BLOCK, () -> { PostTask.postTask(TaskTraits.BEST_EFFORT_MAY_BLOCK, () -> {
ChromeFileProvider provider = new ChromeFileProvider(); ChromeFileProvider provider = new ChromeFileProvider();
...@@ -113,6 +126,11 @@ public class ShareIntentTest { ...@@ -113,6 +126,11 @@ public class ShareIntentTest {
public PackageManager getPackageManager() { public PackageManager getPackageManager() {
return mActivity.getPackageManager(); return mActivity.getPackageManager();
} }
@Override
public Window getWindow() {
return mActivity.getWindow();
}
} }
@Test @Test
...@@ -121,7 +139,7 @@ public class ShareIntentTest { ...@@ -121,7 +139,7 @@ public class ShareIntentTest {
public void testShareIntent() throws ExecutionException, InterruptedException { public void testShareIntent() throws ExecutionException, InterruptedException {
MockChromeActivity mockActivity = TestThreadUtils.runOnUiThreadBlocking(() -> { MockChromeActivity mockActivity = TestThreadUtils.runOnUiThreadBlocking(() -> {
// Sets a test component as last shared and "shareDirectly" option is set so that // Sets a test component as last shared and "shareDirectly" option is set so that
// the share selector menu is not opened. The start activity is overriden, so the // the share selector menu is not opened. The start activity is overridden, so the
// package and class names do not matter. // package and class names do not matter.
return new MockChromeActivity(mActivityTestRule.getActivity()); return new MockChromeActivity(mActivityTestRule.getActivity());
}); });
...@@ -130,6 +148,17 @@ public class ShareIntentTest { ...@@ -130,6 +148,17 @@ public class ShareIntentTest {
// 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); ShareMenuActionHandler.setScreenshotCaptureSkippedForTesting(true);
WindowAndroid window = TestThreadUtils.runOnUiThreadBlocking(() -> {
return new WindowAndroid(mActivityTestRule.getActivity()) {
@Override
public WeakReference<Activity> getActivity() {
return new WeakReference<>(mockActivity);
}
};
});
TestThreadUtils.runOnUiThreadBlocking(
() -> { mockActivity.getActivityTab().updateWindowAndroid(window); });
TestThreadUtils.runOnUiThreadBlocking( TestThreadUtils.runOnUiThreadBlocking(
() -> mockActivity.onShareMenuItemSelected( () -> mockActivity.onShareMenuItemSelected(
true /* shareDirectly */, false /* isIncognito */)); true /* shareDirectly */, false /* isIncognito */));
......
...@@ -274,7 +274,7 @@ public class OfflinePageUtilsTest { ...@@ -274,7 +274,7 @@ public class OfflinePageUtilsTest {
final TestShareCallback shareCallback = new TestShareCallback(semaphore); final TestShareCallback shareCallback = new TestShareCallback(semaphore);
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
OfflinePageUtils.maybeShareOfflinePage(mActivityTestRule.getActivity(), OfflinePageUtils.maybeShareOfflinePage(
mActivityTestRule.getActivity().getActivityTab(), shareCallback); mActivityTestRule.getActivity().getActivityTab(), shareCallback);
}); });
...@@ -301,7 +301,7 @@ public class OfflinePageUtilsTest { ...@@ -301,7 +301,7 @@ public class OfflinePageUtilsTest {
final TestShareCallback shareCallback = new TestShareCallback(semaphore); final TestShareCallback shareCallback = new TestShareCallback(semaphore);
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
OfflinePageUtils.maybeShareOfflinePage(mActivityTestRule.getActivity(), OfflinePageUtils.maybeShareOfflinePage(
mActivityTestRule.getActivity().getActivityTab(), shareCallback); mActivityTestRule.getActivity().getActivityTab(), shareCallback);
}); });
// Wait for share callback to get called. // Wait for share callback to get called.
......
...@@ -6,6 +6,7 @@ package org.chromium.chrome.browser.share; ...@@ -6,6 +6,7 @@ package org.chromium.chrome.browser.share;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest; import android.support.test.filters.SmallTest;
import org.junit.Assert; import org.junit.Assert;
...@@ -18,6 +19,9 @@ import org.chromium.base.test.BaseJUnit4ClassRunner; ...@@ -18,6 +19,9 @@ import org.chromium.base.test.BaseJUnit4ClassRunner;
import org.chromium.chrome.test.ChromeBrowserTestRule; import org.chromium.chrome.test.ChromeBrowserTestRule;
import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
import org.chromium.content_public.browser.UiThreadTaskTraits; import org.chromium.content_public.browser.UiThreadTaskTraits;
import org.chromium.ui.base.WindowAndroid;
import java.lang.ref.WeakReference;
/** /**
* Tests sharing URLs in reader mode (DOM distiller) * Tests sharing URLs in reader mode (DOM distiller)
...@@ -32,8 +36,15 @@ public class ShareUrlTest { ...@@ -32,8 +36,15 @@ public class ShareUrlTest {
private void assertCorrectUrl(final String originalUrl, final String sharedUrl) { private void assertCorrectUrl(final String originalUrl, final String sharedUrl) {
PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> { PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> {
ShareParams params = Activity activity = new Activity();
new ShareParams.Builder(new Activity(), "", sharedUrl).setText("").build(); WindowAndroid window = new WindowAndroid(
InstrumentationRegistry.getInstrumentation().getTargetContext()) {
@Override
public WeakReference<Activity> getActivity() {
return new WeakReference<>(activity);
}
};
ShareParams params = new ShareParams.Builder(window, "", sharedUrl).setText("").build();
Intent intent = ShareHelper.getShareLinkIntent(params); Intent intent = ShareHelper.getShareLinkIntent(params);
Assert.assertTrue(intent.hasExtra(Intent.EXTRA_TEXT)); Assert.assertTrue(intent.hasExtra(Intent.EXTRA_TEXT));
String url = intent.getStringExtra(Intent.EXTRA_TEXT); String url = intent.getStringExtra(Intent.EXTRA_TEXT);
......
...@@ -4,10 +4,8 @@ ...@@ -4,10 +4,8 @@
package org.chromium.chrome.browser.util; package org.chromium.chrome.browser.util;
import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest; import android.support.test.filters.LargeTest;
import android.support.test.filters.SmallTest; import android.support.test.filters.SmallTest;
...@@ -48,8 +46,7 @@ public class ChromeFileProviderTest { ...@@ -48,8 +46,7 @@ public class ChromeFileProviderTest {
@Test @Test
@SmallTest @SmallTest
public void testOpenFileWhenReady() { public void testOpenFileWhenReady() {
Uri uri = Uri uri = ChromeFileProvider.generateUriAndBlockAccess();
ChromeFileProvider.generateUriAndBlockAccess(InstrumentationRegistry.getContext());
Uri fileUri = new Uri.Builder().path("1").build(); Uri fileUri = new Uri.Builder().path("1").build();
ChromeFileProvider.notifyFileReady(uri, fileUri); ChromeFileProvider.notifyFileReady(uri, fileUri);
Uri result = ChromeFileProvider.getFileUriWhenReady(uri); Uri result = ChromeFileProvider.getFileUriWhenReady(uri);
...@@ -59,8 +56,7 @@ public class ChromeFileProviderTest { ...@@ -59,8 +56,7 @@ public class ChromeFileProviderTest {
@Test @Test
@LargeTest @LargeTest
public void testOpenOnAsyncNotify() { public void testOpenOnAsyncNotify() {
final Context context = InstrumentationRegistry.getContext(); final Uri uri = ChromeFileProvider.generateUriAndBlockAccess();
final Uri uri = ChromeFileProvider.generateUriAndBlockAccess(context);
PostTask.postTask(TaskTraits.BEST_EFFORT_MAY_BLOCK, () -> { PostTask.postTask(TaskTraits.BEST_EFFORT_MAY_BLOCK, () -> {
try { try {
Thread.sleep(10); Thread.sleep(10);
...@@ -77,9 +73,8 @@ public class ChromeFileProviderTest { ...@@ -77,9 +73,8 @@ public class ChromeFileProviderTest {
@Test @Test
@LargeTest @LargeTest
public void testFileChanged() { public void testFileChanged() {
final Context context = InstrumentationRegistry.getContext(); Uri uri1 = ChromeFileProvider.generateUriAndBlockAccess();
Uri uri1 = ChromeFileProvider.generateUriAndBlockAccess(context); final Uri uri2 = ChromeFileProvider.generateUriAndBlockAccess();
final Uri uri2 = ChromeFileProvider.generateUriAndBlockAccess(context);
final Uri fileUri2 = new Uri.Builder().path("2").build(); final Uri fileUri2 = new Uri.Builder().path("2").build();
PostTask.postTask(TaskTraits.BEST_EFFORT_MAY_BLOCK, () -> { PostTask.postTask(TaskTraits.BEST_EFFORT_MAY_BLOCK, () -> {
try { try {
......
...@@ -21,6 +21,8 @@ import org.chromium.chrome.R; ...@@ -21,6 +21,8 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.contextmenu.ChromeContextMenuItem.Item; import org.chromium.chrome.browser.contextmenu.ChromeContextMenuItem.Item;
import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator.ContextMenuGroup; import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator.ContextMenuGroup;
import org.chromium.chrome.browser.contextmenu.RevampedContextMenuCoordinator.ListItemType; import org.chromium.chrome.browser.contextmenu.RevampedContextMenuCoordinator.ListItemType;
import org.chromium.ui.base.ActivityWindowAndroid;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.modelutil.MVCListAdapter.ModelList; import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -33,10 +35,12 @@ import java.util.List; ...@@ -33,10 +35,12 @@ import java.util.List;
public class RevampedContextMenuCoordinatorTest { public class RevampedContextMenuCoordinatorTest {
private RevampedContextMenuCoordinator mCoordinator; private RevampedContextMenuCoordinator mCoordinator;
private Activity mActivity; private Activity mActivity;
private WindowAndroid mWindow;
@Before @Before
public void setUpTest() { public void setUpTest() {
mActivity = Robolectric.setupActivity(Activity.class); mActivity = Robolectric.setupActivity(Activity.class);
mWindow = new ActivityWindowAndroid(mActivity, false);
mCoordinator = new RevampedContextMenuCoordinator(0, null); mCoordinator = new RevampedContextMenuCoordinator(0, null);
} }
...@@ -62,7 +66,7 @@ public class RevampedContextMenuCoordinatorTest { ...@@ -62,7 +66,7 @@ public class RevampedContextMenuCoordinatorTest {
rawItems.add(new Pair<>(ContextMenuGroup.IMAGE, groupTwo)); rawItems.add(new Pair<>(ContextMenuGroup.IMAGE, groupTwo));
mCoordinator.initializeHeaderCoordinatorForTesting(mActivity, params); mCoordinator.initializeHeaderCoordinatorForTesting(mActivity, params);
ModelList itemList = mCoordinator.getItemList(mActivity, rawItems, params); ModelList itemList = mCoordinator.getItemList(mWindow, rawItems, params);
assertThat(itemList.get(0).type, equalTo(ListItemType.HEADER)); assertThat(itemList.get(0).type, equalTo(ListItemType.HEADER));
assertThat(itemList.get(1).type, equalTo(ListItemType.DIVIDER)); assertThat(itemList.get(1).type, equalTo(ListItemType.DIVIDER));
...@@ -95,7 +99,7 @@ public class RevampedContextMenuCoordinatorTest { ...@@ -95,7 +99,7 @@ public class RevampedContextMenuCoordinatorTest {
rawItems.add(new Pair<>(ContextMenuGroup.LINK, groupOne)); rawItems.add(new Pair<>(ContextMenuGroup.LINK, groupOne));
mCoordinator.initializeHeaderCoordinatorForTesting(mActivity, params); mCoordinator.initializeHeaderCoordinatorForTesting(mActivity, params);
ModelList itemList = mCoordinator.getItemList(mActivity, rawItems, params); ModelList itemList = mCoordinator.getItemList(mWindow, rawItems, params);
assertThat(itemList.get(0).type, equalTo(ListItemType.HEADER)); assertThat(itemList.get(0).type, equalTo(ListItemType.HEADER));
assertThat(itemList.get(1).type, equalTo(ListItemType.DIVIDER)); assertThat(itemList.get(1).type, equalTo(ListItemType.DIVIDER));
...@@ -116,7 +120,7 @@ public class RevampedContextMenuCoordinatorTest { ...@@ -116,7 +120,7 @@ public class RevampedContextMenuCoordinatorTest {
rawItems.add(new Pair<>(ContextMenuGroup.LINK, groupOne)); rawItems.add(new Pair<>(ContextMenuGroup.LINK, groupOne));
mCoordinator.initializeHeaderCoordinatorForTesting(mActivity, params); mCoordinator.initializeHeaderCoordinatorForTesting(mActivity, params);
ModelList itemList = mCoordinator.getItemList(mActivity, rawItems, params); ModelList itemList = mCoordinator.getItemList(mWindow, rawItems, params);
assertThat(itemList.get(0).type, equalTo(ListItemType.HEADER)); assertThat(itemList.get(0).type, equalTo(ListItemType.HEADER));
assertThat(itemList.get(1).type, equalTo(ListItemType.DIVIDER)); assertThat(itemList.get(1).type, equalTo(ListItemType.DIVIDER));
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
package org.chromium.chrome.browser.util; package org.chromium.chrome.browser.util;
import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.database.MatrixCursor; import android.database.MatrixCursor;
import android.net.Uri; import android.net.Uri;
...@@ -12,6 +11,8 @@ import android.os.ParcelFileDescriptor; ...@@ -12,6 +11,8 @@ import android.os.ParcelFileDescriptor;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.support.v4.content.FileProvider; import android.support.v4.content.FileProvider;
import org.chromium.base.ContextUtils;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.util.Arrays; import java.util.Arrays;
...@@ -42,10 +43,9 @@ public class ChromeFileProvider extends FileProvider { ...@@ -42,10 +43,9 @@ public class ChromeFileProvider extends FileProvider {
* *
* This function clobbers any uri that was previously created and the client application * This function clobbers any uri that was previously created and the client application
* accessing those uri will get a null file descriptor. * accessing those uri will get a null file descriptor.
* @param context Activity context that is used to access package manager.
*/ */
public static Uri generateUriAndBlockAccess(final Context context) { public static Uri generateUriAndBlockAccess() {
String authority = getAuthority(context); String authority = getAuthority();
String fileName = BLOCKED_FILE_PREFIX + String.valueOf(System.nanoTime()); String fileName = BLOCKED_FILE_PREFIX + String.valueOf(System.nanoTime());
Uri blockingUri = new Uri.Builder() Uri blockingUri = new Uri.Builder()
.scheme(UrlConstants.CONTENT_SCHEME) .scheme(UrlConstants.CONTENT_SCHEME)
...@@ -64,13 +64,10 @@ public class ChromeFileProvider extends FileProvider { ...@@ -64,13 +64,10 @@ public class ChromeFileProvider extends FileProvider {
/** /**
* Returns an unique uri to identify the file to be shared. * Returns an unique uri to identify the file to be shared.
*
* @param context Activity context that is used to access package manager.
* @param file File for which the Uri is generated. * @param file File for which the Uri is generated.
*/ */
public static Uri generateUri(final Context context, File file) public static Uri generateUri(File file) throws IllegalArgumentException {
throws IllegalArgumentException { return getUriForFile(ContextUtils.getApplicationContext(), getAuthority(), file);
return getUriForFile(context, getAuthority(context), file);
} }
/** /**
...@@ -184,10 +181,9 @@ public class ChromeFileProvider extends FileProvider { ...@@ -184,10 +181,9 @@ public class ChromeFileProvider extends FileProvider {
/** /**
* Gets the authority string for content URI generation. * Gets the authority string for content URI generation.
* @param context Activity context that is used to access package manager.
*/ */
private static String getAuthority(Context context) { private static String getAuthority() {
return context.getPackageName() + AUTHORITY_SUFFIX; return ContextUtils.getApplicationContext().getPackageName() + AUTHORITY_SUFFIX;
} }
private static boolean doesMatchCurrentBlockingUri(Uri uri) { private static boolean doesMatchCurrentBlockingUri(Uri uri) {
......
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