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