Commit 16caa301 authored by Cathy Li's avatar Cathy Li Committed by Commit Bot

[FeedV2]: Implement sharing capability on feed stream.

Change-Id: Iece225a990448b954161d3286a1f595f60e6f04e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2530262Reviewed-by: default avatarPeter Williamson <petewil@chromium.org>
Commit-Queue: Cathy Li <chili@chromium.org>
Cr-Commit-Position: refs/heads/master@{#826370}
parent 1e7161c7
......@@ -81,7 +81,7 @@ public class FeedSurfaceCoordinator implements FeedSurfaceProvider {
SnackbarManager snackbarManager,
NativePageNavigationDelegate pageNavigationDelegate, UiConfig uiConfig,
boolean placeholderShown, BottomSheetController bottomSheetController,
FeedV1ActionOptions v1ActionOptions);
Supplier<Tab> tabSupplier, FeedV1ActionOptions v1ActionOptions);
/**
* Called after the stream returned by createStream() is no longer needed.
......@@ -105,6 +105,7 @@ public class FeedSurfaceCoordinator implements FeedSurfaceProvider {
private final FeedSurfaceMediator mMediator;
private final BottomSheetController mBottomSheetController;
private final FeedV1ActionOptions mV1ActionOptions;
private final Supplier<Tab> mTabSupplier;
private UiConfig mUiConfig;
private FrameLayout mRootView;
......@@ -275,6 +276,7 @@ public class FeedSurfaceCoordinator implements FeedSurfaceProvider {
mBottomSheetController = bottomSheetController;
mProfile = profile;
mV1ActionOptions = actionOptions;
mTabSupplier = tabProvider;
Resources resources = mActivity.getResources();
mDefaultMarginPixels = mStreamWrapper.defaultMarginPixels(activity);
......@@ -376,7 +378,7 @@ public class FeedSurfaceCoordinator implements FeedSurfaceProvider {
mStreamCreatedTimeMs = SystemClock.elapsedRealtime();
mStream = mStreamWrapper.createStream(mProfile, mActivity, mShowDarkBackground,
mSnackbarManager, mPageNavigationDelegate, mUiConfig, mIsPlaceholderShownInitially,
mBottomSheetController, mV1ActionOptions);
mBottomSheetController, mTabSupplier, mV1ActionOptions);
mStreamLifecycleManager = mDelegate.createStreamLifecycleManager(mStream, mActivity);
......
......@@ -8,6 +8,7 @@ import android.app.Activity;
import androidx.annotation.Nullable;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.feed.FeedSurfaceCoordinator;
import org.chromium.chrome.browser.feed.FeedV1ActionOptions;
......@@ -15,6 +16,7 @@ import org.chromium.chrome.browser.feed.library.api.host.action.ActionApi;
import org.chromium.chrome.browser.feed.shared.stream.Stream;
import org.chromium.chrome.browser.native_page.NativePageNavigationDelegate;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.components.browser_ui.util.GlobalDiscardableReferencePool;
......@@ -44,7 +46,8 @@ public class FeedStreamWrapper implements FeedSurfaceCoordinator.StreamWrapper {
public Stream createStream(Profile profile, Activity activity, boolean showDarkBackground,
SnackbarManager snackbarManager, NativePageNavigationDelegate pageNavigationDelegate,
UiConfig uiConfig, boolean placeholderShown,
BottomSheetController bottomSheetController, FeedV1ActionOptions v1ActionOptions) {
BottomSheetController bottomSheetController, Supplier<Tab> tabSupplier,
FeedV1ActionOptions v1ActionOptions) {
FeedAppLifecycle appLifecycle = FeedProcessScopeFactory.getFeedAppLifecycle();
appLifecycle.onNTPOpened();
......
......@@ -18,11 +18,13 @@ import org.json.JSONObject;
import org.chromium.base.Log;
import org.chromium.base.ObserverList;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.feed.shared.stream.Header;
import org.chromium.chrome.browser.feed.shared.stream.Stream;
import org.chromium.chrome.browser.feedback.HelpAndFeedbackLauncherImpl;
import org.chromium.chrome.browser.native_page.NativePageNavigationDelegate;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
......@@ -53,12 +55,14 @@ public class FeedStream implements Stream {
public FeedStream(Activity activity, boolean isBackgroundDark, SnackbarManager snackbarManager,
NativePageNavigationDelegate nativePageNavigationDelegate,
BottomSheetController bottomSheetController, boolean isPlaceholderShown) {
BottomSheetController bottomSheetController, boolean isPlaceholderShown,
Supplier<Tab> tabSupplier) {
// TODO(petewil): Use isBackgroundDark to turn on dark theme.
this.mActivity = activity;
this.mFeedStreamSurface = new FeedStreamSurface(activity, isBackgroundDark, snackbarManager,
nativePageNavigationDelegate, bottomSheetController,
HelpAndFeedbackLauncherImpl.getInstance(), isPlaceholderShown);
HelpAndFeedbackLauncherImpl.getInstance(), isPlaceholderShown,
new FeedStreamSurface.ShareHelperWrapper(tabSupplier));
}
@Override
......
......@@ -28,6 +28,7 @@ import org.chromium.base.ThreadUtils;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.base.supplier.Supplier;
import org.chromium.base.task.PostTask;
import org.chromium.base.task.TaskTraits;
import org.chromium.chrome.R;
......@@ -59,6 +60,8 @@ import org.chromium.chrome.browser.xsurface.SurfaceScope;
import org.chromium.chrome.browser.xsurface.SurfaceScopeDependencyProvider;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.components.browser_ui.share.ShareHelper;
import org.chromium.components.browser_ui.share.ShareParams;
import org.chromium.components.browser_ui.widget.animation.Interpolators;
import org.chromium.components.feed.proto.FeedUiProto.SharedState;
import org.chromium.components.feed.proto.FeedUiProto.Slice;
......@@ -131,6 +134,8 @@ public class FeedStreamSurface implements SurfaceActionsHandler, FeedActionsHand
private final int mLoadMoreTriggerLookahead;
private boolean mIsLoadingMoreContent;
private boolean mIsPlaceholderShown;
// TabSupplier for the current tab to share.
private final ShareHelperWrapper mShareHelper;
private static ProcessScope sXSurfaceProcessScope;
......@@ -212,6 +217,29 @@ public class FeedStreamSurface implements SurfaceActionsHandler, FeedActionsHand
}
}
/**
* Provides a wrapper around sharing methods.
*
* Makes it easier to test.
*/
public static class ShareHelperWrapper {
private Supplier<Tab> mTabSupplier;
public ShareHelperWrapper(Supplier<Tab> tabSupplier) {
mTabSupplier = tabSupplier;
}
/**
* Shares a url and title from Chrome to another app.
* Brings up the share sheet.
*/
public void share(String url, String title) {
ShareParams params =
new ShareParams.Builder(mTabSupplier.get().getWindowAndroid(), url, title)
.build();
ShareHelper.shareWithUi(params);
}
}
/**
* Provides logging and context for all surfaces.
*
......@@ -395,7 +423,8 @@ public class FeedStreamSurface implements SurfaceActionsHandler, FeedActionsHand
public FeedStreamSurface(Activity activity, boolean isBackgroundDark,
SnackbarManager snackbarManager, NativePageNavigationDelegate pageNavigationDelegate,
BottomSheetController bottomSheetController,
HelpAndFeedbackLauncher helpAndFeedbackLauncher, boolean isPlaceholderShown) {
HelpAndFeedbackLauncher helpAndFeedbackLauncher, boolean isPlaceholderShown,
ShareHelperWrapper shareHelper) {
mNativeFeedStreamSurface = FeedStreamSurfaceJni.get().init(FeedStreamSurface.this);
mSnackbarManager = snackbarManager;
mActivity = activity;
......@@ -408,6 +437,7 @@ public class FeedStreamSurface implements SurfaceActionsHandler, FeedActionsHand
mContentManager = new FeedListContentManager(this, this);
mIsPlaceholderShown = isPlaceholderShown;
mShareHelper = shareHelper;
Context context = new ContextThemeWrapper(
activity, (isBackgroundDark ? R.style.Dark : R.style.Light));
......@@ -930,6 +960,11 @@ public class FeedStreamSurface implements SurfaceActionsHandler, FeedActionsHand
.setDuration(durationMs));
}
@Override
public void share(String url, String title) {
mShareHelper.share(url, title);
}
/**
* Informs whether or not feed content should be shown.
*/
......
......@@ -6,12 +6,14 @@ package org.chromium.chrome.browser.feed.v2;
import android.app.Activity;
import org.chromium.base.supplier.Supplier;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.feed.FeedSurfaceCoordinator;
import org.chromium.chrome.browser.feed.FeedV1ActionOptions;
import org.chromium.chrome.browser.feed.shared.stream.Stream;
import org.chromium.chrome.browser.native_page.NativePageNavigationDelegate;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.components.browser_ui.widget.displaystyle.UiConfig;
......@@ -37,9 +39,10 @@ public class FeedStreamWrapper implements FeedSurfaceCoordinator.StreamWrapper {
public Stream createStream(Profile profile, Activity activity, boolean showDarkBackground,
SnackbarManager snackbarManager, NativePageNavigationDelegate pageNavigationDelegate,
UiConfig uiConfig, boolean placeholderShown,
BottomSheetController bottomSheetController, FeedV1ActionOptions v1ActionOptions) {
BottomSheetController bottomSheetController, Supplier<Tab> tabSupplier,
FeedV1ActionOptions v1ActionOptions) {
mStream = new FeedStream(activity, showDarkBackground, snackbarManager,
pageNavigationDelegate, bottomSheetController, placeholderShown);
pageNavigationDelegate, bottomSheetController, placeholderShown, tabSupplier);
return mStream;
}
......
......@@ -119,6 +119,8 @@ public class FeedStreamSurfaceTest {
Profile mProfileMock;
@Mock
private FeedServiceBridge.Natives mFeedServiceBridgeJniMock;
@Mock
private FeedStreamSurface.ShareHelperWrapper mShareHelper;
@Captor
private ArgumentCaptor<Map<String, String>> mMapCaptor;
......@@ -156,7 +158,7 @@ public class FeedStreamSurfaceTest {
Profile.setLastUsedProfileForTesting(mProfileMock);
mFeedStreamSurface = Mockito.spy(new FeedStreamSurface(mActivity, false, mSnackbarManager,
mPageNavigationDelegate, mBottomSheetController, mHelpAndFeedbackLauncherImpl,
/* isPlaceholderShown= */ false));
/* isPlaceholderShown= */ false, mShareHelper));
mContentManager = mFeedStreamSurface.getFeedListContentManagerForTesting();
mFeedStreamSurface.mRootView = Mockito.spy(mFeedStreamSurface.mRootView);
mRecyclerView = mFeedStreamSurface.mRootView;
......@@ -555,6 +557,15 @@ public class FeedStreamSurfaceTest {
verify(mBottomSheetController).hideContent(any(), anyBoolean());
}
@Test
@SmallTest
public void testShare() {
String url = "http://www.foo.com";
String title = "fooTitle";
mFeedStreamSurface.share(url, title);
verify(mShareHelper).share(url, title);
}
@Test
@SmallTest
public void testRemoveContentsOnSurfaceClosed() {
......
......@@ -33,9 +33,11 @@ import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowLog;
import org.chromium.base.Callback;
import org.chromium.base.supplier.Supplier;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.JniMocker;
import org.chromium.chrome.browser.native_page.NativePageNavigationDelegate;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
......@@ -59,6 +61,8 @@ public class FeedStreamTest {
private FeedStreamSurface.Natives mFeedStreamSurfaceJniMock;
@Mock
private FeedServiceBridge.Natives mFeedServiceBridgeJniMock;
@Mock
private Supplier<Tab> mTabSupplier;
@Rule
public JniMocker mocker = new JniMocker();
......@@ -75,7 +79,7 @@ public class FeedStreamTest {
// Surfaces won't open until after startup.
FeedStreamSurface.startup();
mFeedStream = new FeedStream(mActivity, false, mSnackbarManager, mPageNavigationDelegate,
mBottomSheetController, /* isPlaceholderShown= */ false);
mBottomSheetController, /* isPlaceholderShown= */ false, mTabSupplier);
mFeedStream.onCreate(null);
mRecyclerView = (RecyclerView) mFeedStream.getView();
mLayoutManager = new FakeLinearLayoutManager(mActivity);
......
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