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.
|
+ } |
} |
/** |