| Index: chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
|
| index d9903b5a3df9f488ee3ea63a63bb86d157c8239b..5a166a59204b7fe69d7d6577a52a3fe7f44f62a3 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
|
| @@ -6,18 +6,22 @@
|
|
|
| import android.content.Context;
|
| import android.support.annotation.DrawableRes;
|
| +import android.support.annotation.Nullable;
|
| import android.support.annotation.StringRes;
|
| import android.support.v7.widget.RecyclerView;
|
|
|
| import org.chromium.base.ContextUtils;
|
| import org.chromium.base.metrics.RecordUserAction;
|
| import org.chromium.chrome.R;
|
| +import org.chromium.chrome.browser.ntp.NewTabPage.DestructionObserver;
|
| import org.chromium.chrome.browser.ntp.UiConfig;
|
| import org.chromium.chrome.browser.ntp.snippets.SnippetArticle;
|
| import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
|
| import org.chromium.chrome.browser.signin.AccountSigninActivity;
|
| import org.chromium.chrome.browser.signin.SigninAccessPoint;
|
| import org.chromium.chrome.browser.signin.SigninManager;
|
| +import org.chromium.chrome.browser.signin.SigninManager.SignInAllowedObserver;
|
| +import org.chromium.chrome.browser.signin.SigninManager.SignInStateObserver;
|
|
|
| /**
|
| * Shows a card prompting the user to sign in. This item is also a {@link TreeNode}, and calling
|
| @@ -38,11 +42,16 @@
|
| */
|
| private boolean mDismissed;
|
|
|
| - public SignInPromo(NodeParent parent) {
|
| + @Nullable
|
| + private final SigninObserver mObserver;
|
| +
|
| + public SignInPromo(NodeParent parent, NewTabPageAdapter adapter) {
|
| super(parent);
|
| mDismissed = ChromePreferenceManager.getInstance(ContextUtils.getApplicationContext())
|
| .getNewTabPageSigninPromoDismissed();
|
| - SigninManager signinManager = SigninManager.get(ContextUtils.getApplicationContext());
|
| +
|
| + final SigninManager signinManager = SigninManager.get(ContextUtils.getApplicationContext());
|
| + mObserver = mDismissed ? null : new SigninObserver(signinManager, adapter);
|
| mVisible = signinManager.isSignInAllowed() && !signinManager.isSignedInOnNative();
|
| }
|
|
|
| @@ -60,6 +69,15 @@ public int getItemViewType(int position) {
|
| return ItemViewType.PROMO;
|
| }
|
|
|
| + /**
|
| + * @returns a {@link DestructionObserver} observer that updates the visibility of the signin
|
| + * promo and unregisters itself when the New Tab Page is destroyed.
|
| + */
|
| + @Nullable
|
| + public DestructionObserver getObserver() {
|
| + return mObserver;
|
| + }
|
| +
|
| @Override
|
| public void onBindViewHolder(NewTabPageViewHolder holder, int position) {
|
| checkIndex(position);
|
| @@ -127,6 +145,59 @@ public void dismiss() {
|
| mDismissed = true;
|
| ChromePreferenceManager.getInstance(ContextUtils.getApplicationContext())
|
| .setNewTabPageSigninPromoDismissed(true);
|
| + mObserver.unregister();
|
| + }
|
| +
|
| + private class SigninObserver
|
| + implements SignInStateObserver, SignInAllowedObserver, DestructionObserver {
|
| + private final SigninManager mSigninManager;
|
| + private final NewTabPageAdapter mAdapter;
|
| +
|
| + /** Guards {@link #unregister()}, which can be called multiple times. */
|
| + private boolean mUnregistered;
|
| +
|
| + private SigninObserver(SigninManager signinManager, NewTabPageAdapter adapter) {
|
| + mSigninManager = signinManager;
|
| + mAdapter = adapter;
|
| + mSigninManager.addSignInAllowedObserver(this);
|
| + mSigninManager.addSignInStateObserver(this);
|
| + }
|
| +
|
| + private void unregister() {
|
| + if (mUnregistered) return;
|
| + mUnregistered = true;
|
| +
|
| + mSigninManager.removeSignInAllowedObserver(this);
|
| + mSigninManager.removeSignInStateObserver(this);
|
| + }
|
| +
|
| + @Override
|
| + public void onDestroy() {
|
| + unregister();
|
| + }
|
| +
|
| + @Override
|
| + public void onSignInAllowedChanged() {
|
| + // Listening to onSignInAllowedChanged is important for the FRE. Sign in is not allowed
|
| + // until it is completed, but the NTP is initialised before the FRE is even shown. By
|
| + // implementing this we can show the promo if the user did not sign in during the FRE.
|
| + if (mSigninManager.isSignInAllowed()) {
|
| + maybeShow();
|
| + } else {
|
| + hide();
|
| + }
|
| + }
|
| +
|
| + @Override
|
| + public void onSignedIn() {
|
| + hide();
|
| + mAdapter.resetSections(/*alwaysAllowEmptySections=*/false);
|
| + }
|
| +
|
| + @Override
|
| + public void onSignedOut() {
|
| + maybeShow();
|
| + }
|
| }
|
|
|
| /**
|
|
|