Commit 56c8db18 authored by Pavel Yatsuk's avatar Pavel Yatsuk Committed by Commit Bot

[GID] Update identity disc based on signed-in and sync state

Identity disc should only be displayed on NTP for signed-in users with
enabled sync. IdentityDiscController should monitor sign-in state and
sync settings and show/hide identity disc accordingly. Typical scenario
involves user signing out or disabling sync while on NTP. In this case
identity disc should be hidden immediately.

BUG=958982
R=mastiz@chromium.org,bsazonov@chromium.org,twellington@chromium.org

Change-Id: Idf3fc6b8bc714634799e62a415ac51be91ff2621
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1633590Reviewed-by: default avatarTheresa <twellington@chromium.org>
Reviewed-by: default avatarMikel Astiz <mastiz@chromium.org>
Reviewed-by: default avatarBoris Sazonov <bsazonov@chromium.org>
Commit-Queue: Pavel Yatsuk <pavely@chromium.org>
Cr-Commit-Position: refs/heads/master@{#664565}
parent 8e8610e9
...@@ -10,9 +10,12 @@ import android.support.annotation.DimenRes; ...@@ -10,9 +10,12 @@ import android.support.annotation.DimenRes;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.lifecycle.NativeInitObserver;
import org.chromium.chrome.browser.preferences.PreferencesLauncher; import org.chromium.chrome.browser.preferences.PreferencesLauncher;
import org.chromium.chrome.browser.preferences.SyncAndServicesPreferences; import org.chromium.chrome.browser.preferences.SyncAndServicesPreferences;
import org.chromium.chrome.browser.signin.ProfileDataCache; import org.chromium.chrome.browser.signin.ProfileDataCache;
import org.chromium.chrome.browser.signin.SigninManager;
import org.chromium.components.signin.ChromeSigninController; import org.chromium.components.signin.ChromeSigninController;
import org.chromium.components.sync.AndroidSyncSettings; import org.chromium.components.sync.AndroidSyncSettings;
...@@ -22,21 +25,51 @@ import java.util.Collections; ...@@ -22,21 +25,51 @@ import java.util.Collections;
* Handles displaying IdentityDisc on toolbar depending on several conditions * Handles displaying IdentityDisc on toolbar depending on several conditions
* (user sign-in state, whether NTP is shown) * (user sign-in state, whether NTP is shown)
*/ */
class IdentityDiscController implements ProfileDataCache.Observer { class IdentityDiscController implements NativeInitObserver, ProfileDataCache.Observer,
SigninManager.SignInStateObserver,
AndroidSyncSettings.AndroidSyncSettingsObserver {
// Context is used for fetching resources and launching preferences page.
private final Context mContext; private final Context mContext;
// Toolbar manager exposes APIs for manipulating experimental button.
private final ToolbarManager mToolbarManager; private final ToolbarManager mToolbarManager;
private ActivityLifecycleDispatcher mActivityLifecycleDispatcher;
// SigninManager and AndroidSyncSettings allow observing sign-in and sync state.
private SigninManager mSigninManager;
private AndroidSyncSettings mAndroidSyncSettings;
// ProfileDataCache facilitates retrieving profile picture.
private ProfileDataCache mProfileDataCache; private ProfileDataCache mProfileDataCache;
private boolean mIsIdentityDiscVisible; private boolean mIsIdentityDiscVisible;
private boolean mIsNTPVisible;
/** /**
* Creates IdentityDiscController object. * Creates IdentityDiscController object.
* @param context The Context for retrieving resources, launching preference activiy, etc. * @param context The Context for retrieving resources, launching preference activiy, etc.
* @param toolbarManager The ToolbarManager where Identity Disc is displayed. * @param toolbarManager The ToolbarManager where Identity Disc is displayed.
*/ */
IdentityDiscController(Context context, ToolbarManager toolbarManager) { IdentityDiscController(Context context, ToolbarManager toolbarManager,
ActivityLifecycleDispatcher activityLifecycleDispatcher) {
mContext = context; mContext = context;
mToolbarManager = toolbarManager; mToolbarManager = toolbarManager;
mActivityLifecycleDispatcher = activityLifecycleDispatcher;
mActivityLifecycleDispatcher.register(this);
}
/**
* Registers itself to observe sign-in and sync status events.
*/
@Override
public void onFinishNativeInitialization() {
mSigninManager = SigninManager.get();
mSigninManager.addSignInStateObserver(this);
mAndroidSyncSettings = AndroidSyncSettings.get();
mAndroidSyncSettings.registerObserver(this);
mActivityLifecycleDispatcher.unregister(this);
mActivityLifecycleDispatcher = null;
} }
/** /**
...@@ -45,14 +78,18 @@ class IdentityDiscController implements ProfileDataCache.Observer { ...@@ -45,14 +78,18 @@ class IdentityDiscController implements ProfileDataCache.Observer {
void updateButtonState(boolean isNTPVisible) { void updateButtonState(boolean isNTPVisible) {
if (!ChromeFeatureList.isEnabled(ChromeFeatureList.IDENTITY_DISC)) return; if (!ChromeFeatureList.isEnabled(ChromeFeatureList.IDENTITY_DISC)) return;
if (isNTPVisible && !mIsIdentityDiscVisible) { mIsNTPVisible = isNTPVisible;
String accountName = ChromeSigninController.get().getSignedInAccountName(); String accountName = ChromeSigninController.get().getSignedInAccountName();
if (accountName != null && AndroidSyncSettings.get().isChromeSyncEnabled()) { boolean shouldShowIdentityDisc =
createProfileDataCache(); isNTPVisible && accountName != null && AndroidSyncSettings.get().isSyncEnabled();
showIdentityDisc(accountName);
mIsIdentityDiscVisible = true; if (shouldShowIdentityDisc == mIsIdentityDiscVisible) return;
}
} else if (!isNTPVisible && mIsIdentityDiscVisible) { if (shouldShowIdentityDisc) {
mIsIdentityDiscVisible = true;
createProfileDataCache(accountName);
showIdentityDisc(accountName);
} else {
mIsIdentityDiscVisible = false; mIsIdentityDiscVisible = false;
mToolbarManager.disableExperimentalButton(); mToolbarManager.disableExperimentalButton();
} }
...@@ -62,7 +99,7 @@ class IdentityDiscController implements ProfileDataCache.Observer { ...@@ -62,7 +99,7 @@ class IdentityDiscController implements ProfileDataCache.Observer {
* Creates and initializes ProfileDataCache if it wasn't created previously. Subscribes * Creates and initializes ProfileDataCache if it wasn't created previously. Subscribes
* IdentityDiscController for profile data updates. * IdentityDiscController for profile data updates.
*/ */
private void createProfileDataCache() { private void createProfileDataCache(String accountName) {
if (mProfileDataCache != null) return; if (mProfileDataCache != null) return;
@DimenRes @DimenRes
...@@ -72,13 +109,13 @@ class IdentityDiscController implements ProfileDataCache.Observer { ...@@ -72,13 +109,13 @@ class IdentityDiscController implements ProfileDataCache.Observer {
int imageSize = mContext.getResources().getDimensionPixelSize(dimension_id); int imageSize = mContext.getResources().getDimensionPixelSize(dimension_id);
mProfileDataCache = new ProfileDataCache(mContext, imageSize); mProfileDataCache = new ProfileDataCache(mContext, imageSize);
mProfileDataCache.addObserver(this); mProfileDataCache.addObserver(this);
mProfileDataCache.update(Collections.singletonList(accountName));
} }
/** /**
* Triggers profile image fetch and displays Identity Disc on top toolbar. * Triggers profile image fetch and displays Identity Disc on top toolbar.
*/ */
private void showIdentityDisc(String accountName) { private void showIdentityDisc(String accountName) {
mProfileDataCache.update(Collections.singletonList(accountName));
Drawable profileImage = mProfileDataCache.getProfileDataOrDefault(accountName).getImage(); Drawable profileImage = mProfileDataCache.getProfileDataOrDefault(accountName).getImage();
mToolbarManager.enableExperimentalButton(view -> { mToolbarManager.enableExperimentalButton(view -> {
PreferencesLauncher.launchSettingsPage(mContext, SyncAndServicesPreferences.class); PreferencesLauncher.launchSettingsPage(mContext, SyncAndServicesPreferences.class);
...@@ -100,6 +137,27 @@ class IdentityDiscController implements ProfileDataCache.Observer { ...@@ -100,6 +137,27 @@ class IdentityDiscController implements ProfileDataCache.Observer {
} }
} }
// SigninManager.SignInStateObserver implementation.
@Override
public void onSignedIn() {
String accountName = ChromeSigninController.get().getSignedInAccountName();
if (mProfileDataCache != null && accountName != null) {
mProfileDataCache.update(Collections.singletonList(accountName));
}
updateButtonState(mIsNTPVisible);
}
@Override
public void onSignedOut() {
updateButtonState(mIsNTPVisible);
}
// AndroidSyncSettings.AndroidSyncSettingsObserver implementation.
@Override
public void androidSyncSettingsChanged() {
updateButtonState(mIsNTPVisible);
}
/** /**
* Call to tear down dependencies. * Call to tear down dependencies.
*/ */
...@@ -108,5 +166,13 @@ class IdentityDiscController implements ProfileDataCache.Observer { ...@@ -108,5 +166,13 @@ class IdentityDiscController implements ProfileDataCache.Observer {
mProfileDataCache.removeObserver(this); mProfileDataCache.removeObserver(this);
mProfileDataCache = null; mProfileDataCache = null;
} }
if (mSigninManager != null) {
mSigninManager.removeSignInStateObserver(this);
mSigninManager = null;
}
if (mAndroidSyncSettings != null) {
mAndroidSyncSettings.unregisterObserver(this);
mAndroidSyncSettings = null;
}
} }
} }
...@@ -318,7 +318,8 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF ...@@ -318,7 +318,8 @@ public class ToolbarManager implements ScrimObserver, ToolbarTabController, UrlF
mActionModeController = new ActionModeController(mActivity, mActionBarDelegate); mActionModeController = new ActionModeController(mActivity, mActionBarDelegate);
mActionModeController.setCustomSelectionActionModeCallback(mToolbarActionModeCallback); mActionModeController.setCustomSelectionActionModeCallback(mToolbarActionModeCallback);
mIdentityDiscController = new IdentityDiscController(activity, this); mIdentityDiscController =
new IdentityDiscController(activity, this, activity.getLifecycleDispatcher());
mToolbar.setPaintInvalidator(invalidator); mToolbar.setPaintInvalidator(invalidator);
mActionModeController.setTabStripHeight(mToolbar.getTabStripHeight()); mActionModeController.setTabStripHeight(mToolbar.getTabStripHeight());
......
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