Commit f1b1920d authored by Becky Zhou's avatar Becky Zhou Committed by Commit Bot

[Feed] Add sign-in promo to the Feed NTP

This patch extracts the SuggestionsSource dependency out from
SignInPromo.java so that we can reuse the logic from SignInPromo.java.

Bug: 860043
Change-Id: I62e38c37727a3a14727fedc505bb1c7031365024
Reviewed-on: https://chromium-review.googlesource.com/1168116
Commit-Queue: Becky Zhou <huayinz@chromium.org>
Reviewed-by: default avatarTheresa <twellington@chromium.org>
Reviewed-by: default avatarBernhard Bauer <bauerb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#590548}
parent 964eb45f
...@@ -15,11 +15,13 @@ import android.support.annotation.Nullable; ...@@ -15,11 +15,13 @@ import android.support.annotation.Nullable;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ScrollView; import android.widget.ScrollView;
import com.google.android.libraries.feed.api.scope.FeedProcessScope; import com.google.android.libraries.feed.api.scope.FeedProcessScope;
import com.google.android.libraries.feed.api.scope.FeedStreamScope; import com.google.android.libraries.feed.api.scope.FeedStreamScope;
import com.google.android.libraries.feed.api.stream.Header;
import com.google.android.libraries.feed.api.stream.NonDismissibleHeader; import com.google.android.libraries.feed.api.stream.NonDismissibleHeader;
import com.google.android.libraries.feed.api.stream.Stream; import com.google.android.libraries.feed.api.stream.Stream;
import com.google.android.libraries.feed.host.action.ActionApi; import com.google.android.libraries.feed.host.action.ActionApi;
...@@ -41,6 +43,7 @@ import org.chromium.chrome.browser.ntp.snippets.SectionHeaderView; ...@@ -41,6 +43,7 @@ import org.chromium.chrome.browser.ntp.snippets.SectionHeaderView;
import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.search_engines.TemplateUrlService; import org.chromium.chrome.browser.search_engines.TemplateUrlService;
import org.chromium.chrome.browser.signin.PersonalizedSigninPromoView;
import org.chromium.chrome.browser.snackbar.Snackbar; import org.chromium.chrome.browser.snackbar.Snackbar;
import org.chromium.chrome.browser.snackbar.SnackbarManager; import org.chromium.chrome.browser.snackbar.SnackbarManager;
import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelector;
...@@ -57,6 +60,8 @@ import java.util.Arrays; ...@@ -57,6 +60,8 @@ import java.util.Arrays;
*/ */
public class FeedNewTabPage extends NewTabPage { public class FeedNewTabPage extends NewTabPage {
private final FeedNewTabPageMediator mMediator; private final FeedNewTabPageMediator mMediator;
private final int mDefaultMargin;
private final int mWideMargin;
private UiConfig mUiConfig; private UiConfig mUiConfig;
private FrameLayout mRootView; private FrameLayout mRootView;
...@@ -67,6 +72,7 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -67,6 +72,7 @@ public class FeedNewTabPage extends NewTabPage {
private @Nullable FeedImageLoader mImageLoader; private @Nullable FeedImageLoader mImageLoader;
private @Nullable StreamLifecycleManager mStreamLifecycleManager; private @Nullable StreamLifecycleManager mStreamLifecycleManager;
private @Nullable SectionHeaderView mSectionHeaderView; private @Nullable SectionHeaderView mSectionHeaderView;
private @Nullable PersonalizedSigninPromoView mSigninPromoView;
// Used when Feed is disabled by policy. // Used when Feed is disabled by policy.
private @Nullable ScrollView mScrollViewForPolicy; private @Nullable ScrollView mScrollViewForPolicy;
...@@ -158,6 +164,23 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -158,6 +164,23 @@ public class FeedNewTabPage extends NewTabPage {
} }
} }
private class SignInPromoHeader implements Header {
@Override
public View getView() {
return getSigninPromoView();
}
@Override
public boolean isDismissible() {
return true;
}
@Override
public void onDismissed() {
mMediator.onSignInPromoDismissed();
}
}
/** /**
* Provides the additional capabilities needed for the {@link FeedNewTabPage} container view. * Provides the additional capabilities needed for the {@link FeedNewTabPage} container view.
*/ */
...@@ -190,6 +213,11 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -190,6 +213,11 @@ public class FeedNewTabPage extends NewTabPage {
TabModelSelector tabModelSelector) { TabModelSelector tabModelSelector) {
super(activity, nativePageHost, tabModelSelector); super(activity, nativePageHost, tabModelSelector);
Resources resources = activity.getResources();
mDefaultMargin =
resources.getDimensionPixelSize(R.dimen.content_suggestions_card_modern_margin);
mWideMargin = resources.getDimensionPixelSize(R.dimen.ntp_wide_card_lateral_margins);
LayoutInflater inflater = LayoutInflater.from(activity); LayoutInflater inflater = LayoutInflater.from(activity);
mNewTabPageLayout = (NewTabPageLayout) inflater.inflate(R.layout.new_tab_page_layout, null); mNewTabPageLayout = (NewTabPageLayout) inflater.inflate(R.layout.new_tab_page_layout, null);
...@@ -293,14 +321,7 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -293,14 +321,7 @@ public class FeedNewTabPage extends NewTabPage {
LayoutInflater inflater = LayoutInflater.from(activity); LayoutInflater inflater = LayoutInflater.from(activity);
mSectionHeaderView = (SectionHeaderView) inflater.inflate( mSectionHeaderView = (SectionHeaderView) inflater.inflate(
R.layout.new_tab_page_snippets_expandable_header, null); R.layout.new_tab_page_snippets_expandable_header, null);
MarginResizer.createAndAttach(mSectionHeaderView, mUiConfig, mDefaultMargin, mWideMargin);
// TODO(huayinz): Add MarginResizer for sign-in promo under issue 860051 or 860043,
// depending on which one lands first.
Resources resources = mSectionHeaderView.getResources();
int defaultMargin =
resources.getDimensionPixelSize(R.dimen.content_suggestions_card_modern_margin);
int wideMargin = resources.getDimensionPixelSize(R.dimen.ntp_wide_card_lateral_margins);
MarginResizer.createAndAttach(mSectionHeaderView, mUiConfig, defaultMargin, wideMargin);
View view = mStream.getView(); View view = mStream.getView();
view.setBackgroundColor(Color.WHITE); view.setBackgroundColor(Color.WHITE);
...@@ -308,6 +329,7 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -308,6 +329,7 @@ public class FeedNewTabPage extends NewTabPage {
UiUtils.removeViewFromParent(mNewTabPageLayout); UiUtils.removeViewFromParent(mNewTabPageLayout);
UiUtils.removeViewFromParent(mSectionHeaderView); UiUtils.removeViewFromParent(mSectionHeaderView);
if (mSigninPromoView != null) UiUtils.removeViewFromParent(mSigninPromoView);
mStream.setHeaderViews(Arrays.asList(new NonDismissibleHeader(mNewTabPageLayout), mStream.setHeaderViews(Arrays.asList(new NonDismissibleHeader(mNewTabPageLayout),
new NonDismissibleHeader(mSectionHeaderView))); new NonDismissibleHeader(mSectionHeaderView)));
// Explicitly request focus on the scroll container to avoid UrlBar being focused after // Explicitly request focus on the scroll container to avoid UrlBar being focused after
...@@ -355,6 +377,32 @@ public class FeedNewTabPage extends NewTabPage { ...@@ -355,6 +377,32 @@ public class FeedNewTabPage extends NewTabPage {
return mSectionHeaderView; return mSectionHeaderView;
} }
/** @return The {@link PersonalizedSigninPromoView} for this class. */
PersonalizedSigninPromoView getSigninPromoView() {
if (mSigninPromoView == null) {
LayoutInflater inflater = LayoutInflater.from(mRootView.getContext());
mSigninPromoView = (PersonalizedSigninPromoView) inflater.inflate(
R.layout.personalized_signin_promo_view_modern_content_suggestions, null);
ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.bottomMargin = mDefaultMargin;
mSigninPromoView.setLayoutParams(lp);
MarginResizer.createAndAttach(mSigninPromoView, mUiConfig, mDefaultMargin, mWideMargin);
}
return mSigninPromoView;
}
/** Update header views in the Stream. */
void updateHeaderViews(boolean isPromoVisible) {
mStream.setHeaderViews(isPromoVisible
? Arrays.asList(new NonDismissibleHeader(mNewTabPageLayout),
new SignInPromoHeader(),
new NonDismissibleHeader(mSectionHeaderView))
: Arrays.asList(new NonDismissibleHeader(mNewTabPageLayout),
new NonDismissibleHeader(mSectionHeaderView)));
}
/** /**
* Configures the {@link FeedNewTabPage} for testing. * Configures the {@link FeedNewTabPage} for testing.
* @param inTestMode Whether test mode is enabled. If true, test implementations of Feed * @param inTestMode Whether test mode is enabled. If true, test implementations of Feed
......
...@@ -6,6 +6,8 @@ package org.chromium.chrome.browser.feed; ...@@ -6,6 +6,8 @@ package org.chromium.chrome.browser.feed;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Rect; import android.graphics.Rect;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.ScrollView; import android.widget.ScrollView;
import com.google.android.libraries.feed.api.stream.ContentChangedListener; import com.google.android.libraries.feed.api.stream.ContentChangedListener;
...@@ -18,10 +20,13 @@ import org.chromium.chrome.R; ...@@ -18,10 +20,13 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.ntp.ContextMenuManager; import org.chromium.chrome.browser.ntp.ContextMenuManager;
import org.chromium.chrome.browser.ntp.NewTabPageLayout; import org.chromium.chrome.browser.ntp.NewTabPageLayout;
import org.chromium.chrome.browser.ntp.SnapScrollHelper; import org.chromium.chrome.browser.ntp.SnapScrollHelper;
import org.chromium.chrome.browser.ntp.cards.SignInPromo;
import org.chromium.chrome.browser.ntp.snippets.SectionHeader; import org.chromium.chrome.browser.ntp.snippets.SectionHeader;
import org.chromium.chrome.browser.preferences.Pref; import org.chromium.chrome.browser.preferences.Pref;
import org.chromium.chrome.browser.preferences.PrefChangeRegistrar; import org.chromium.chrome.browser.preferences.PrefChangeRegistrar;
import org.chromium.chrome.browser.preferences.PrefServiceBridge; import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.signin.PersonalizedSigninPromoView;
import org.chromium.chrome.browser.signin.SigninPromoUtil;
/** /**
* A mediator for the {@link FeedNewTabPage} responsible for interacting with the * A mediator for the {@link FeedNewTabPage} responsible for interacting with the
...@@ -37,6 +42,7 @@ class FeedNewTabPageMediator ...@@ -37,6 +42,7 @@ class FeedNewTabPageMediator
private ContentChangedListener mStreamContentChangedListener; private ContentChangedListener mStreamContentChangedListener;
private SectionHeader mSectionHeader; private SectionHeader mSectionHeader;
private MemoryPressureCallback mMemoryPressureCallback; private MemoryPressureCallback mMemoryPressureCallback;
private @Nullable SignInPromo mSignInPromo;
private boolean mFeedEnabled; private boolean mFeedEnabled;
private boolean mTouchEnabled = true; private boolean mTouchEnabled = true;
...@@ -116,16 +122,23 @@ class FeedNewTabPageMediator ...@@ -116,16 +122,23 @@ class FeedNewTabPageMediator
mStreamContentChangedListener = () -> mStreamContentChanged = true; mStreamContentChangedListener = () -> mStreamContentChanged = true;
stream.addOnContentChangedListener(mStreamContentChangedListener); stream.addOnContentChangedListener(mStreamContentChangedListener);
boolean suggestionsVisible =
PrefServiceBridge.getInstance().getBoolean(Pref.NTP_ARTICLES_LIST_VISIBLE);
Resources res = mCoordinator.getSectionHeaderView().getResources(); Resources res = mCoordinator.getSectionHeaderView().getResources();
mSectionHeader = mSectionHeader =
new SectionHeader(res.getString(R.string.ntp_article_suggestions_section_header), new SectionHeader(res.getString(R.string.ntp_article_suggestions_section_header),
PrefServiceBridge.getInstance().getBoolean(Pref.NTP_ARTICLES_LIST_VISIBLE), suggestionsVisible, this::onSectionHeaderToggled);
this::onSectionHeaderToggled); mPrefChangeRegistrar.addObserver(Pref.NTP_ARTICLES_LIST_VISIBLE, this::updateSectionHeader);
mPrefChangeRegistrar.addObserver(
Pref.NTP_ARTICLES_LIST_VISIBLE, this::updateSectionHeader);
mCoordinator.getSectionHeaderView().setHeader(mSectionHeader); mCoordinator.getSectionHeaderView().setHeader(mSectionHeader);
stream.setStreamContentVisibility(mSectionHeader.isExpanded()); stream.setStreamContentVisibility(mSectionHeader.isExpanded());
if (SignInPromo.shouldCreatePromo()) {
mSignInPromo = new FeedSignInPromo();
mSignInPromo.setCanShowPersonalizedSuggestions(suggestionsVisible);
}
mCoordinator.updateHeaderViews(mSignInPromo != null && mSignInPromo.isVisible());
mMemoryPressureCallback = pressure -> mCoordinator.getStream().trim(); mMemoryPressureCallback = pressure -> mCoordinator.getStream().trim();
MemoryPressureListener.addCallback(mMemoryPressureCallback); MemoryPressureListener.addCallback(mMemoryPressureCallback);
} }
...@@ -138,10 +151,12 @@ class FeedNewTabPageMediator ...@@ -138,10 +151,12 @@ class FeedNewTabPageMediator
stream.removeScrollListener(mStreamScrollListener); stream.removeScrollListener(mStreamScrollListener);
stream.removeOnContentChangedListener(mStreamContentChangedListener); stream.removeOnContentChangedListener(mStreamContentChangedListener);
MemoryPressureListener.removeCallback(mMemoryPressureCallback); MemoryPressureListener.removeCallback(mMemoryPressureCallback);
if (mSignInPromo != null) mSignInPromo.destroy();
mPrefChangeRegistrar.removeObserver(Pref.NTP_ARTICLES_LIST_VISIBLE); mPrefChangeRegistrar.removeObserver(Pref.NTP_ARTICLES_LIST_VISIBLE);
mStreamScrollListener = null; mStreamScrollListener = null;
mStreamContentChangedListener = null; mStreamContentChangedListener = null;
mMemoryPressureCallback = null; mMemoryPressureCallback = null;
mSignInPromo = null;
} }
/** /**
...@@ -154,9 +169,11 @@ class FeedNewTabPageMediator ...@@ -154,9 +169,11 @@ class FeedNewTabPageMediator
/** Update whether the section header should be expanded. */ /** Update whether the section header should be expanded. */
private void updateSectionHeader() { private void updateSectionHeader() {
if (mSectionHeader.isExpanded() boolean suggestionsVisible =
!= PrefServiceBridge.getInstance().getBoolean(Pref.NTP_ARTICLES_LIST_VISIBLE)) { PrefServiceBridge.getInstance().getBoolean(Pref.NTP_ARTICLES_LIST_VISIBLE);
mSectionHeader.toggleHeader(); if (mSectionHeader.isExpanded() != suggestionsVisible) mSectionHeader.toggleHeader();
if (mSignInPromo != null) {
mSignInPromo.setCanShowPersonalizedSuggestions(suggestionsVisible);
} }
} }
...@@ -172,6 +189,16 @@ class FeedNewTabPageMediator ...@@ -172,6 +189,16 @@ class FeedNewTabPageMediator
mCoordinator.getSectionHeaderView().updateVisuals(); mCoordinator.getSectionHeaderView().updateVisuals();
} }
/**
* Callback on sign-in promo is dismissed.
*/
void onSignInPromoDismissed() {
View view = mCoordinator.getSigninPromoView();
mSignInPromo.dismiss(removedItemTitle
-> view.announceForAccessibility(view.getResources().getString(
R.string.ntp_accessibility_item_removed, removedItemTitle)));
}
/** Whether a new thumbnail should be captured. */ /** Whether a new thumbnail should be captured. */
boolean shouldCaptureThumbnail() { boolean shouldCaptureThumbnail() {
return mStreamContentChanged || mCoordinator.getView().getWidth() != mThumbnailWidth return mStreamContentChanged || mCoordinator.getView().getWidth() != mThumbnailWidth
...@@ -260,4 +287,33 @@ class FeedNewTabPageMediator ...@@ -260,4 +287,33 @@ class FeedNewTabPageMediator
mCoordinator.getScrollViewForPolicy().smoothScrollBy(0, scrollTo - initialScroll); mCoordinator.getScrollViewForPolicy().smoothScrollBy(0, scrollTo - initialScroll);
} }
} }
/**
* The {@link SignInPromo} for the Feed.
* TODO(huayinz): Update content and visibility through a ModelChangeProcessor.
*/
private class FeedSignInPromo extends SignInPromo {
FeedSignInPromo() {
updateSignInPromo();
}
@Override
protected void setVisibilityInternal(boolean visible) {
if (isVisible() == visible) return;
super.setVisibilityInternal(visible);
mCoordinator.updateHeaderViews(visible);
}
@Override
protected void notifyDataChanged() {
updateSignInPromo();
}
/** Update the content displayed in {@link PersonalizedSigninPromoView}. */
private void updateSignInPromo() {
SigninPromoUtil.setupPromoViewFromCache(mSigninPromoController, mProfileDataCache,
mCoordinator.getSigninPromoView(), null);
}
}
} }
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
package org.chromium.chrome.browser.bookmarks; package org.chromium.chrome.browser.bookmarks;
import android.accounts.Account;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.support.annotation.IntDef; import android.support.annotation.IntDef;
...@@ -18,13 +17,13 @@ import android.view.ViewGroup; ...@@ -18,13 +17,13 @@ import android.view.ViewGroup;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.signin.DisplayableProfileData;
import org.chromium.chrome.browser.signin.PersonalizedSigninPromoView; import org.chromium.chrome.browser.signin.PersonalizedSigninPromoView;
import org.chromium.chrome.browser.signin.ProfileDataCache; import org.chromium.chrome.browser.signin.ProfileDataCache;
import org.chromium.chrome.browser.signin.SigninAccessPoint; import org.chromium.chrome.browser.signin.SigninAccessPoint;
import org.chromium.chrome.browser.signin.SigninManager; import org.chromium.chrome.browser.signin.SigninManager;
import org.chromium.chrome.browser.signin.SigninManager.SignInStateObserver; import org.chromium.chrome.browser.signin.SigninManager.SignInStateObserver;
import org.chromium.chrome.browser.signin.SigninPromoController; import org.chromium.chrome.browser.signin.SigninPromoController;
import org.chromium.chrome.browser.signin.SigninPromoUtil;
import org.chromium.chrome.browser.signin.SyncPromoView; import org.chromium.chrome.browser.signin.SyncPromoView;
import org.chromium.components.signin.AccountManagerFacade; import org.chromium.components.signin.AccountManagerFacade;
import org.chromium.components.signin.AccountsChangeObserver; import org.chromium.components.signin.AccountsChangeObserver;
...@@ -34,7 +33,6 @@ import org.chromium.components.sync.AndroidSyncSettings.AndroidSyncSettingsObser ...@@ -34,7 +33,6 @@ import org.chromium.components.sync.AndroidSyncSettings.AndroidSyncSettingsObser
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.util.Collections;
/** /**
* Class that manages all the logic and UI behind the signin promo header in the bookmark * Class that manages all the logic and UI behind the signin promo header in the bookmark
...@@ -160,15 +158,8 @@ class BookmarkPromoHeader implements AndroidSyncSettingsObserver, SignInStateObs ...@@ -160,15 +158,8 @@ class BookmarkPromoHeader implements AndroidSyncSettingsObserver, SignInStateObs
* @param view The view to be configured. * @param view The view to be configured.
*/ */
void setupPersonalizedSigninPromo(PersonalizedSigninPromoView view) { void setupPersonalizedSigninPromo(PersonalizedSigninPromoView view) {
DisplayableProfileData profileData = null; SigninPromoUtil.setupPromoViewFromCache(mSigninPromoController, mProfileDataCache, view,
Account[] accounts = AccountManagerFacade.get().tryGetGoogleAccounts(); this::setPersonalizedSigninPromoDeclined);
if (accounts.length > 0) {
String defaultAccountName = accounts[0].name;
mProfileDataCache.update(Collections.singletonList(defaultAccountName));
profileData = mProfileDataCache.getProfileDataOrDefault(defaultAccountName);
}
SigninPromoController.OnDismissListener listener = this::setPersonalizedSigninPromoDeclined;
mSigninPromoController.setupPromoView(mContext, view, profileData, listener);
} }
/** /**
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
package org.chromium.chrome.browser.ntp; package org.chromium.chrome.browser.ntp;
import android.accounts.Account;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.support.annotation.IntDef; import android.support.annotation.IntDef;
...@@ -21,13 +20,13 @@ import org.chromium.chrome.browser.invalidation.InvalidationController; ...@@ -21,13 +20,13 @@ import org.chromium.chrome.browser.invalidation.InvalidationController;
import org.chromium.chrome.browser.ntp.ForeignSessionHelper.ForeignSession; import org.chromium.chrome.browser.ntp.ForeignSessionHelper.ForeignSession;
import org.chromium.chrome.browser.ntp.ForeignSessionHelper.ForeignSessionTab; import org.chromium.chrome.browser.ntp.ForeignSessionHelper.ForeignSessionTab;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.signin.DisplayableProfileData;
import org.chromium.chrome.browser.signin.PersonalizedSigninPromoView; import org.chromium.chrome.browser.signin.PersonalizedSigninPromoView;
import org.chromium.chrome.browser.signin.ProfileDataCache; import org.chromium.chrome.browser.signin.ProfileDataCache;
import org.chromium.chrome.browser.signin.SigninAccessPoint; import org.chromium.chrome.browser.signin.SigninAccessPoint;
import org.chromium.chrome.browser.signin.SigninManager; import org.chromium.chrome.browser.signin.SigninManager;
import org.chromium.chrome.browser.signin.SigninManager.SignInStateObserver; import org.chromium.chrome.browser.signin.SigninManager.SignInStateObserver;
import org.chromium.chrome.browser.signin.SigninPromoController; import org.chromium.chrome.browser.signin.SigninPromoController;
import org.chromium.chrome.browser.signin.SigninPromoUtil;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.components.signin.AccountManagerFacade; import org.chromium.components.signin.AccountManagerFacade;
import org.chromium.components.signin.AccountsChangeObserver; import org.chromium.components.signin.AccountsChangeObserver;
...@@ -380,15 +379,8 @@ public class RecentTabsManager implements AndroidSyncSettingsObserver, SignInSta ...@@ -380,15 +379,8 @@ public class RecentTabsManager implements AndroidSyncSettingsObserver, SignInSta
* @param view The view to be configured. * @param view The view to be configured.
*/ */
void setupPersonalizedSigninPromo(PersonalizedSigninPromoView view) { void setupPersonalizedSigninPromo(PersonalizedSigninPromoView view) {
DisplayableProfileData profileData = null; SigninPromoUtil.setupPromoViewFromCache(
Account[] accounts = AccountManagerFacade.get().tryGetGoogleAccounts(); mSigninPromoController, mProfileDataCache, view, null);
if (accounts.length > 0) {
String defaultAccountName = accounts[0].name;
mProfileDataCache.update(Collections.singletonList(defaultAccountName));
profileData = mProfileDataCache.getProfileDataOrDefault(defaultAccountName);
}
mSigninPromoController.detach();
mSigninPromoController.setupPromoView(mContext, view, profileData, null);
} }
// SignInStateObserver implementation. // SignInStateObserver implementation.
......
...@@ -55,6 +55,8 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> ...@@ -55,6 +55,8 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder>
private final AllDismissedItem mAllDismissed; private final AllDismissedItem mAllDismissed;
private final Footer mFooter; private final Footer mFooter;
private final RemoteSuggestionsStatusObserver mRemoteSuggestionsStatusObserver;
/** /**
* Creates the adapter that will manage all the cards to display on the NTP. * Creates the adapter that will manage all the cards to display on the NTP.
* @param uiDelegate used to interact with the rest of the system. * @param uiDelegate used to interact with the rest of the system.
...@@ -75,9 +77,16 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> ...@@ -75,9 +77,16 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder>
mUiConfig = uiConfig; mUiConfig = uiConfig;
mRoot = new InnerNode<>(); mRoot = new InnerNode<>();
mSections = new SectionList(mUiDelegate, offlinePageBridge); mSections = new SectionList(mUiDelegate, offlinePageBridge);
mSigninPromo = SignInPromo.maybeCreatePromo(mUiDelegate);
mAllDismissed = new AllDismissedItem(); mAllDismissed = new AllDismissedItem();
if (SignInPromo.shouldCreatePromo()) {
mSigninPromo = new SignInPromo();
mSigninPromo.setCanShowPersonalizedSuggestions(
mUiDelegate.getSuggestionsSource().areRemoteSuggestionsEnabled());
} else {
mSigninPromo = null;
}
if (mAboveTheFoldView != null) mRoot.addChildren(new AboveTheFoldItem()); if (mAboveTheFoldView != null) mRoot.addChildren(new AboveTheFoldItem());
if (SuggestionsConfig.scrollToLoad()) { if (SuggestionsConfig.scrollToLoad()) {
...@@ -96,8 +105,8 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> ...@@ -96,8 +105,8 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder>
mOfflinePageBridge = offlinePageBridge; mOfflinePageBridge = offlinePageBridge;
RemoteSuggestionsStatusObserver suggestionsObserver = new RemoteSuggestionsStatusObserver(); mRemoteSuggestionsStatusObserver = new RemoteSuggestionsStatusObserver();
mUiDelegate.addDestructionObserver(suggestionsObserver); mUiDelegate.addDestructionObserver(mRemoteSuggestionsStatusObserver);
updateAllDismissedVisibility(); updateAllDismissedVisibility();
mRoot.addObserver(this); mRoot.addObserver(this);
...@@ -135,7 +144,8 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> ...@@ -135,7 +144,8 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder>
mRecyclerView, mContextMenuManager, mUiDelegate, mUiConfig); mRecyclerView, mContextMenuManager, mUiDelegate, mUiConfig);
case ItemViewType.PROMO: case ItemViewType.PROMO:
return mSigninPromo.createViewHolder(mRecyclerView, mContextMenuManager, mUiConfig); return new PersonalizedPromoViewHolder(
mRecyclerView, mContextMenuManager, mUiConfig);
case ItemViewType.FOOTER: case ItemViewType.FOOTER:
return new Footer.ViewHolder(mRecyclerView, mUiDelegate.getNavigationDelegate()); return new Footer.ViewHolder(mRecyclerView, mUiDelegate.getNavigationDelegate());
...@@ -304,6 +314,16 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> ...@@ -304,6 +314,16 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder>
return mRoot; return mRoot;
} }
@VisibleForTesting
SuggestionsSource.Observer getSuggestionsSourceObserverForTesting() {
return mRemoteSuggestionsStatusObserver;
}
@VisibleForTesting
SignInPromo getSignInPromoForTesting() {
return mSigninPromo;
}
private class RemoteSuggestionsStatusObserver private class RemoteSuggestionsStatusObserver
extends SuggestionsSource.EmptyObserver implements DestructionObserver { extends SuggestionsSource.EmptyObserver implements DestructionObserver {
public RemoteSuggestionsStatusObserver() { public RemoteSuggestionsStatusObserver() {
...@@ -316,11 +336,20 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> ...@@ -316,11 +336,20 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder>
if (!SnippetsBridge.isCategoryRemote(category)) return; if (!SnippetsBridge.isCategoryRemote(category)) return;
updateAllDismissedVisibility(); updateAllDismissedVisibility();
// Checks whether the category is enabled first to avoid unnecessary
// calls across JNI.
if (mSigninPromo != null) {
mSigninPromo.setCanShowPersonalizedSuggestions(
SnippetsBridge.isCategoryEnabled(newStatus)
|| mUiDelegate.getSuggestionsSource().areRemoteSuggestionsEnabled());
}
} }
@Override @Override
public void onDestroy() { public void onDestroy() {
mUiDelegate.getSuggestionsSource().removeObserver(this); mUiDelegate.getSuggestionsSource().removeObserver(this);
if (mSigninPromo != null) mSigninPromo.destroy();
} }
} }
} }
// Copyright 2018 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.ntp.cards;
import android.support.annotation.DrawableRes;
import android.support.annotation.Nullable;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ntp.ContextMenuManager;
import org.chromium.chrome.browser.signin.DisplayableProfileData;
import org.chromium.chrome.browser.signin.PersonalizedSigninPromoView;
import org.chromium.chrome.browser.signin.ProfileDataCache;
import org.chromium.chrome.browser.signin.SigninPromoController;
import org.chromium.chrome.browser.signin.SigninPromoUtil;
import org.chromium.chrome.browser.suggestions.SuggestionsConfig;
import org.chromium.chrome.browser.suggestions.SuggestionsRecyclerView;
import org.chromium.chrome.browser.util.FeatureUtilities;
import org.chromium.chrome.browser.widget.displaystyle.UiConfig;
/**
* View Holder for {@link SignInPromo} if the personalized promo is to be shown.
*/
public class PersonalizedPromoViewHolder extends CardViewHolder {
private @Nullable ProfileDataCache mProfileDataCache;
private @Nullable SigninPromoController mSigninPromoController;
public PersonalizedPromoViewHolder(SuggestionsRecyclerView parent,
ContextMenuManager contextMenuManager, UiConfig config) {
super(SuggestionsConfig.useModernLayout()
? R.layout.personalized_signin_promo_view_modern_content_suggestions
: R.layout.personalized_signin_promo_view_ntp_content_suggestions,
parent, config, contextMenuManager);
if (!FeatureUtilities.isChromeModernDesignEnabled()) {
getParams().topMargin = parent.getResources().getDimensionPixelSize(
R.dimen.ntp_sign_in_promo_margin_top);
}
}
public void onBindViewHolder(
SigninPromoController signinPromoController, ProfileDataCache profileDataCache) {
super.onBindViewHolder();
mSigninPromoController = signinPromoController;
mProfileDataCache = profileDataCache;
updatePersonalizedSigninPromo();
}
@Override
public void recycle() {
if (mSigninPromoController != null) {
mSigninPromoController.detach();
mSigninPromoController = null;
}
mProfileDataCache = null;
super.recycle();
}
@DrawableRes
@Override
protected int selectBackground(boolean hasCardAbove, boolean hasCardBelow) {
// Modern does not update the card background.
assert !SuggestionsConfig.useModernLayout();
return R.drawable.ntp_signin_promo_card_single;
}
/**
* Triggers an update of the personalized signin promo. Intended to be used as
* {@link NewTabPageViewHolder.PartialBindCallback}.
*/
public static void update(NewTabPageViewHolder viewHolder) {
((PersonalizedPromoViewHolder) viewHolder).updatePersonalizedSigninPromo();
}
private void updatePersonalizedSigninPromo() {
SigninPromoUtil.setupPromoViewFromCache(mSigninPromoController, mProfileDataCache,
(PersonalizedSigninPromoView) itemView, null);
}
/**
* Binds the view and sets the profile data directly. Used for testing purposes.
* @param profileData The profile data which will be used to configure the personalized
* signin promo.
*/
public void bindAndConfigureViewForTests(@Nullable DisplayableProfileData profileData) {
super.onBindViewHolder();
PersonalizedSigninPromoView view = (PersonalizedSigninPromoView) itemView;
mSigninPromoController.setupPromoView(view.getContext(), view, profileData, null);
}
public void setSigninPromoControllerForTests(@Nullable SigninPromoController controller) {
mSigninPromoController = controller;
}
}
\ No newline at end of file
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
package org.chromium.chrome.browser.preferences; package org.chromium.chrome.browser.preferences;
import android.accounts.Account;
import android.content.Context; import android.content.Context;
import android.preference.Preference; import android.preference.Preference;
import android.preference.PreferenceFragment; import android.preference.PreferenceFragment;
...@@ -27,6 +26,7 @@ import org.chromium.chrome.browser.signin.SigninAccessPoint; ...@@ -27,6 +26,7 @@ import org.chromium.chrome.browser.signin.SigninAccessPoint;
import org.chromium.chrome.browser.signin.SigninManager; import org.chromium.chrome.browser.signin.SigninManager;
import org.chromium.chrome.browser.signin.SigninManager.SignInAllowedObserver; import org.chromium.chrome.browser.signin.SigninManager.SignInAllowedObserver;
import org.chromium.chrome.browser.signin.SigninPromoController; import org.chromium.chrome.browser.signin.SigninPromoController;
import org.chromium.chrome.browser.signin.SigninPromoUtil;
import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.chrome.browser.sync.ProfileSyncService;
import org.chromium.chrome.browser.sync.ProfileSyncService.SyncStateChangedListener; import org.chromium.chrome.browser.sync.ProfileSyncService.SyncStateChangedListener;
import org.chromium.chrome.browser.util.ViewUtils; import org.chromium.chrome.browser.util.ViewUtils;
...@@ -277,21 +277,15 @@ public class SignInPreference ...@@ -277,21 +277,15 @@ public class SignInPreference
return; return;
} }
DisplayableProfileData profileData = null;
Account[] accounts = AccountManagerFacade.get().tryGetGoogleAccounts();
if (accounts.length > 0) {
String defaultAccountName = accounts[0].name;
mProfileDataCache.update(Collections.singletonList(defaultAccountName));
profileData = mProfileDataCache.getProfileDataOrDefault(defaultAccountName);
}
PersonalizedSigninPromoView signinPromoView = PersonalizedSigninPromoView signinPromoView =
view.findViewById(R.id.signin_promo_view_container); view.findViewById(R.id.signin_promo_view_container);
mSigninPromoController.detach(); SigninPromoUtil.setupPromoViewFromCache(
mSigninPromoController.setupPromoView(getContext(), signinPromoView, profileData, () -> { mSigninPromoController, mProfileDataCache, signinPromoView, () -> {
ChromePreferenceManager.getInstance().writeBoolean( ChromePreferenceManager.getInstance().writeBoolean(
ChromePreferenceManager.SETTINGS_PERSONALIZED_SIGNIN_PROMO_DISMISSED, true); ChromePreferenceManager.SETTINGS_PERSONALIZED_SIGNIN_PROMO_DISMISSED,
update(); true);
}); update();
});
if (ChromeFeatureList.isEnabled(ChromeFeatureList.UNIFIED_CONSENT)) { if (ChromeFeatureList.isEnabled(ChromeFeatureList.UNIFIED_CONSENT)) {
View divider = view.findViewById(R.id.divider); View divider = view.findViewById(R.id.divider);
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
package org.chromium.chrome.browser.signin; package org.chromium.chrome.browser.signin;
import android.accounts.Account;
import android.app.Activity; import android.app.Activity;
import android.text.TextUtils; import android.text.TextUtils;
...@@ -17,6 +18,7 @@ import org.chromium.components.signin.AccountManagerFacade; ...@@ -17,6 +18,7 @@ import org.chromium.components.signin.AccountManagerFacade;
import org.chromium.components.signin.ChromeSigninController; import org.chromium.components.signin.ChromeSigninController;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
...@@ -98,6 +100,26 @@ public class SigninPromoUtil { ...@@ -98,6 +100,26 @@ public class SigninPromoUtil {
return previousAccountNames == null || !previousAccountNames.containsAll(accountNames); return previousAccountNames == null || !previousAccountNames.containsAll(accountNames);
} }
/**
* @param signinPromoController The {@link SigninPromoController} that maintains the view.
* @param profileDataCache The {@link ProfileDataCache} that stores profile data.
* @param view The {@link PersonalizedSigninPromoView} that should be set up.
* @param listener The {@link SigninPromoController.OnDismissListener} to be set to the view.
*/
public static void setupPromoViewFromCache(SigninPromoController signinPromoController,
ProfileDataCache profileDataCache, PersonalizedSigninPromoView view,
SigninPromoController.OnDismissListener listener) {
DisplayableProfileData profileData = null;
Account[] accounts = AccountManagerFacade.get().tryGetGoogleAccounts();
if (accounts.length > 0) {
String defaultAccountName = accounts[0].name;
profileDataCache.update(Collections.singletonList(defaultAccountName));
profileData = profileDataCache.getProfileDataOrDefault(defaultAccountName);
}
signinPromoController.detach();
signinPromoController.setupPromoView(view.getContext(), view, profileData, listener);
}
/** /**
* A convenience method to create an AccountSigninActivity, passing the access point as an * A convenience method to create an AccountSigninActivity, passing the access point as an
* intent extra. * intent extra.
......
...@@ -933,6 +933,7 @@ chrome_java_sources = [ ...@@ -933,6 +933,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageViewHolder.java", "java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageViewHolder.java",
"java/src/org/chromium/chrome/browser/ntp/cards/OptionalLeaf.java", "java/src/org/chromium/chrome/browser/ntp/cards/OptionalLeaf.java",
"java/src/org/chromium/chrome/browser/ntp/cards/PartiallyBindable.java", "java/src/org/chromium/chrome/browser/ntp/cards/PartiallyBindable.java",
"java/src/org/chromium/chrome/browser/ntp/cards/PersonalizedPromoViewHolder.java",
"java/src/org/chromium/chrome/browser/ntp/cards/ProgressIndicatorView.java", "java/src/org/chromium/chrome/browser/ntp/cards/ProgressIndicatorView.java",
"java/src/org/chromium/chrome/browser/ntp/cards/ProgressItem.java", "java/src/org/chromium/chrome/browser/ntp/cards/ProgressItem.java",
"java/src/org/chromium/chrome/browser/ntp/cards/ProgressViewHolder.java", "java/src/org/chromium/chrome/browser/ntp/cards/ProgressViewHolder.java",
......
...@@ -18,6 +18,7 @@ import android.util.TypedValue; ...@@ -18,6 +18,7 @@ import android.util.TypedValue;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
...@@ -37,8 +38,7 @@ import org.chromium.chrome.browser.ChromeSwitches; ...@@ -37,8 +38,7 @@ import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.favicon.IconType; import org.chromium.chrome.browser.favicon.IconType;
import org.chromium.chrome.browser.favicon.LargeIconBridge; import org.chromium.chrome.browser.favicon.LargeIconBridge;
import org.chromium.chrome.browser.ntp.ContextMenuManager; import org.chromium.chrome.browser.ntp.ContextMenuManager;
import org.chromium.chrome.browser.ntp.cards.NewTabPageViewHolder; import org.chromium.chrome.browser.ntp.cards.PersonalizedPromoViewHolder;
import org.chromium.chrome.browser.ntp.cards.SignInPromo;
import org.chromium.chrome.browser.ntp.cards.SuggestionsCategoryInfo; import org.chromium.chrome.browser.ntp.cards.SuggestionsCategoryInfo;
import org.chromium.chrome.browser.signin.DisplayableProfileData; import org.chromium.chrome.browser.signin.DisplayableProfileData;
import org.chromium.chrome.browser.signin.SigninAccessPoint; import org.chromium.chrome.browser.signin.SigninAccessPoint;
...@@ -99,7 +99,7 @@ public class ArticleSnippetsTest { ...@@ -99,7 +99,7 @@ public class ArticleSnippetsTest {
private ContextMenuManager mContextMenuManager; private ContextMenuManager mContextMenuManager;
private FrameLayout mContentView; private FrameLayout mContentView;
private SnippetArticleViewHolder mSuggestion; private SnippetArticleViewHolder mSuggestion;
private NewTabPageViewHolder mSigninPromo; private PersonalizedPromoViewHolder mSigninPromo;
private UiConfig mUiConfig; private UiConfig mUiConfig;
...@@ -144,6 +144,11 @@ public class ArticleSnippetsTest { ...@@ -144,6 +144,11 @@ public class ArticleSnippetsTest {
}); });
} }
@After
public void tearDown() {
if (mSigninPromo != null) mSigninPromo.setSigninPromoControllerForTests(null);
}
@Test @Test
@MediumTest @MediumTest
@Feature({"ArticleSnippets", "RenderTest"}) @Feature({"ArticleSnippets", "RenderTest"})
...@@ -343,10 +348,9 @@ public class ArticleSnippetsTest { ...@@ -343,10 +348,9 @@ public class ArticleSnippetsTest {
private void createPersonalizedSigninPromo(@Nullable DisplayableProfileData profileData) { private void createPersonalizedSigninPromo(@Nullable DisplayableProfileData profileData) {
SigninPromoController signinPromoController = SigninPromoController signinPromoController =
new SigninPromoController(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS); new SigninPromoController(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS);
mSigninPromo = new SignInPromo.PersonalizedPromoViewHolder( mSigninPromo = new PersonalizedPromoViewHolder(mRecyclerView, null, mUiConfig);
mRecyclerView, mUiConfig, null, null, signinPromoController); mSigninPromo.setSigninPromoControllerForTests(signinPromoController);
((SignInPromo.PersonalizedPromoViewHolder) mSigninPromo) mSigninPromo.bindAndConfigureViewForTests(profileData);
.bindAndConfigureViewForTests(profileData);
} }
private DisplayableProfileData getTestProfileData() { private DisplayableProfileData getTestProfileData() {
......
...@@ -69,8 +69,6 @@ import org.chromium.chrome.browser.preferences.ChromePreferenceManager; ...@@ -69,8 +69,6 @@ import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
import org.chromium.chrome.browser.preferences.Pref; import org.chromium.chrome.browser.preferences.Pref;
import org.chromium.chrome.browser.preferences.PrefServiceBridge; import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.signin.SigninManager; import org.chromium.chrome.browser.signin.SigninManager;
import org.chromium.chrome.browser.signin.SigninManager.SignInAllowedObserver;
import org.chromium.chrome.browser.signin.SigninManager.SignInStateObserver;
import org.chromium.chrome.browser.suggestions.ContentSuggestionsAdditionalAction; import org.chromium.chrome.browser.suggestions.ContentSuggestionsAdditionalAction;
import org.chromium.chrome.browser.suggestions.DestructionObserver; import org.chromium.chrome.browser.suggestions.DestructionObserver;
import org.chromium.chrome.browser.suggestions.SuggestionsEventReporter; import org.chromium.chrome.browser.suggestions.SuggestionsEventReporter;
...@@ -915,31 +913,28 @@ public class NewTabPageAdapterTest { ...@@ -915,31 +913,28 @@ public class NewTabPageAdapterTest {
assertItemsFor(sectionWithStatusCard().withProgress(), signinPromo()); assertItemsFor(sectionWithStatusCard().withProgress(), signinPromo());
assertTrue(isSignInPromoVisible()); assertTrue(isSignInPromoVisible());
// Note: As currently implemented, these variables should point to the same object, a
// SignInPromo.SigninObserver
List<DestructionObserver> observers = getDestructionObserver(mUiDelegate); List<DestructionObserver> observers = getDestructionObserver(mUiDelegate);
SignInStateObserver signInStateObserver =
findFirstInstanceOf(observers, SignInStateObserver.class);
assertNotNull(signInStateObserver);
SignInAllowedObserver signInAllowedObserver =
findFirstInstanceOf(observers, SignInAllowedObserver.class);
assertNotNull(signInAllowedObserver);
SuggestionsSource.Observer suggestionsObserver = SuggestionsSource.Observer suggestionsObserver =
findFirstInstanceOf(observers, SuggestionsSource.Observer.class); findFirstInstanceOf(observers, SuggestionsSource.Observer.class);
assertNotNull(suggestionsObserver); assertNotNull(suggestionsObserver);
signInStateObserver.onSignedIn(); SignInPromo signInPromo = mAdapter.getSignInPromoForTesting();
assertNotNull(signInPromo);
SigninObserver signinObserver = signInPromo.getSigninObserverForTesting();
assertNotNull(signinObserver);
signinObserver.onSignedIn();
assertFalse(isSignInPromoVisible()); assertFalse(isSignInPromoVisible());
signInStateObserver.onSignedOut(); signinObserver.onSignedOut();
assertTrue(isSignInPromoVisible()); assertTrue(isSignInPromoVisible());
when(mMockSigninManager.isSignInAllowed()).thenReturn(false); when(mMockSigninManager.isSignInAllowed()).thenReturn(false);
signInAllowedObserver.onSignInAllowedChanged(); signinObserver.onSignInAllowedChanged();
assertFalse(isSignInPromoVisible()); assertFalse(isSignInPromoVisible());
when(mMockSigninManager.isSignInAllowed()).thenReturn(true); when(mMockSigninManager.isSignInAllowed()).thenReturn(true);
signInAllowedObserver.onSignInAllowedChanged(); signinObserver.onSignInAllowedChanged();
assertTrue(isSignInPromoVisible()); assertTrue(isSignInPromoVisible());
mSource.setRemoteSuggestionsEnabled(false); mSource.setRemoteSuggestionsEnabled(false);
...@@ -1018,8 +1013,9 @@ public class NewTabPageAdapterTest { ...@@ -1018,8 +1013,9 @@ public class NewTabPageAdapterTest {
@Test @Test
@Feature({"Ntp"}) @Feature({"Ntp"})
public void testAllDismissedVisibility() { public void testAllDismissedVisibility() {
SigninObserver signinObserver = SignInPromo signInPromo = mAdapter.getSignInPromoForTesting();
findFirstInstanceOf(getDestructionObserver(mUiDelegate), SigninObserver.class); assertNotNull(signInPromo);
SigninObserver signinObserver = signInPromo.getSigninObserverForTesting();
assertNotNull(signinObserver); assertNotNull(signinObserver);
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
...@@ -1092,7 +1088,7 @@ public class NewTabPageAdapterTest { ...@@ -1092,7 +1088,7 @@ public class NewTabPageAdapterTest {
// Disabling remote suggestions should remove both the promo and the AllDismissed item // Disabling remote suggestions should remove both the promo and the AllDismissed item
mSource.setRemoteSuggestionsEnabled(false); mSource.setRemoteSuggestionsEnabled(false);
signinObserver.onCategoryStatusChanged( mAdapter.getSuggestionsSourceObserverForTesting().onCategoryStatusChanged(
KnownCategories.REMOTE_CATEGORIES_OFFSET + TEST_CATEGORY, KnownCategories.REMOTE_CATEGORIES_OFFSET + TEST_CATEGORY,
CategoryStatus.CATEGORY_EXPLICITLY_DISABLED); CategoryStatus.CATEGORY_EXPLICITLY_DISABLED);
// Adapter content: // Adapter content:
...@@ -1110,7 +1106,7 @@ public class NewTabPageAdapterTest { ...@@ -1110,7 +1106,7 @@ public class NewTabPageAdapterTest {
// Prepare some suggestions. They should not load because the category is dismissed on // Prepare some suggestions. They should not load because the category is dismissed on
// the current NTP. // the current NTP.
mSource.setRemoteSuggestionsEnabled(true); mSource.setRemoteSuggestionsEnabled(true);
signinObserver.onCategoryStatusChanged( mAdapter.getSuggestionsSourceObserverForTesting().onCategoryStatusChanged(
KnownCategories.REMOTE_CATEGORIES_OFFSET + TEST_CATEGORY, CategoryStatus.AVAILABLE); KnownCategories.REMOTE_CATEGORIES_OFFSET + TEST_CATEGORY, CategoryStatus.AVAILABLE);
mSource.setStatusForCategory(TEST_CATEGORY, CategoryStatus.AVAILABLE); mSource.setStatusForCategory(TEST_CATEGORY, CategoryStatus.AVAILABLE);
mSource.setSuggestionsForCategory(TEST_CATEGORY, createDummySuggestions(1, TEST_CATEGORY)); mSource.setSuggestionsForCategory(TEST_CATEGORY, createDummySuggestions(1, TEST_CATEGORY));
......
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