Chromium Code Reviews| 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..18c4ee494a8bbda47589d66adc3a9af4ad552a27 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.SelfRegistrable; |
| 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,14 @@ public int getItemViewType(int position) { |
| return ItemViewType.PROMO; |
| } |
| + /** |
| + * @returns a {@link SelfRegistrable} observer that updates the visiblity of the signin promo |
| + */ |
| + @Nullable |
| + public SelfRegistrable getObserver() { |
| + return mObserver; |
| + } |
| + |
| @Override |
| public void onBindViewHolder(NewTabPageViewHolder holder, int position) { |
| checkIndex(position); |
| @@ -127,6 +144,60 @@ public void dismiss() { |
| mDismissed = true; |
| ChromePreferenceManager.getInstance(ContextUtils.getApplicationContext()) |
| .setNewTabPageSigninPromoDismissed(true); |
| + mObserver.unregister(); |
| + } |
| + |
| + private class SigninObserver |
| + implements SignInStateObserver, SignInAllowedObserver, SelfRegistrable { |
| + private boolean mRegistered; |
| + private final SigninManager mSigninManager; |
| + private final NewTabPageAdapter mAdapter; |
| + |
| + private SigninObserver(SigninManager signinManager, NewTabPageAdapter adapter) { |
| + mSigninManager = signinManager; |
| + mAdapter = adapter; |
| + } |
| + |
| + @Override |
| + public void register() { |
| + if (mRegistered) return; |
| + mRegistered = true; |
| + |
| + mSigninManager.addSignInAllowedObserver(this); |
| + mSigninManager.addSignInStateObserver(this); |
| + } |
| + |
| + @Override |
| + public void unregister() { |
| + if (!mRegistered) return; |
| + mRegistered = false; |
| + |
| + mSigninManager.removeSignInAllowedObserver(this); |
| + mSigninManager.removeSignInStateObserver(this); |
| + } |
| + |
| + @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() { |
| + SignInPromo.this.hide(); |
|
Michael van Ouwerkerk
2016/10/19 12:09:18
nit: could this just be "hide()"?
dgn
2016/10/19 17:03:41
Done.
|
| + mAdapter.resetSections(/*alwaysAllowEmptySections=*/false); |
| + } |
| + |
| + @Override |
| + public void onSignedOut() { |
| + SignInPromo.this.maybeShow(); |
|
Michael van Ouwerkerk
2016/10/19 12:09:18
nit: could this just be "maybeShow()"?
dgn
2016/10/19 17:03:41
Done.
|
| + } |
| } |
| /** |