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;
import org.chromium.chrome.R;
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.SyncAndServicesPreferences;
import org.chromium.chrome.browser.signin.ProfileDataCache;
import org.chromium.chrome.browser.signin.SigninManager;
import org.chromium.components.signin.ChromeSigninController;
import org.chromium.components.sync.AndroidSyncSettings;
......@@ -22,21 +25,51 @@ import java.util.Collections;
* Handles displaying IdentityDisc on toolbar depending on several conditions
* (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;
// Toolbar manager exposes APIs for manipulating experimental button.
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 boolean mIsIdentityDiscVisible;
private boolean mIsNTPVisible;
/**
* Creates IdentityDiscController object.
* @param context The Context for retrieving resources, launching preference activiy, etc.
* @param toolbarManager The ToolbarManager where Identity Disc is displayed.
*/
IdentityDiscController(Context context, ToolbarManager toolbarManager) {
IdentityDiscController(Context context, ToolbarManager toolbarManager,
ActivityLifecycleDispatcher activityLifecycleDispatcher) {
mContext = context;
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 {
void updateButtonState(boolean isNTPVisible) {
if (!ChromeFeatureList.isEnabled(ChromeFeatureList.IDENTITY_DISC)) return;
if (isNTPVisible && !mIsIdentityDiscVisible) {
mIsNTPVisible = isNTPVisible;
String accountName = ChromeSigninController.get().getSignedInAccountName();
if (accountName != null && AndroidSyncSettings.get().isChromeSyncEnabled()) {
createProfileDataCache();
showIdentityDisc(accountName);
boolean shouldShowIdentityDisc =
isNTPVisible && accountName != null && AndroidSyncSettings.get().isSyncEnabled();
if (shouldShowIdentityDisc == mIsIdentityDiscVisible) return;
if (shouldShowIdentityDisc) {
mIsIdentityDiscVisible = true;
}
} else if (!isNTPVisible && mIsIdentityDiscVisible) {
createProfileDataCache(accountName);
showIdentityDisc(accountName);
} else {
mIsIdentityDiscVisible = false;
mToolbarManager.disableExperimentalButton();
}
......@@ -62,7 +99,7 @@ class IdentityDiscController implements ProfileDataCache.Observer {
* Creates and initializes ProfileDataCache if it wasn't created previously. Subscribes
* IdentityDiscController for profile data updates.
*/
private void createProfileDataCache() {
private void createProfileDataCache(String accountName) {
if (mProfileDataCache != null) return;
@DimenRes
......@@ -72,13 +109,13 @@ class IdentityDiscController implements ProfileDataCache.Observer {
int imageSize = mContext.getResources().getDimensionPixelSize(dimension_id);
mProfileDataCache = new ProfileDataCache(mContext, imageSize);
mProfileDataCache.addObserver(this);
mProfileDataCache.update(Collections.singletonList(accountName));
}
/**
* Triggers profile image fetch and displays Identity Disc on top toolbar.
*/
private void showIdentityDisc(String accountName) {
mProfileDataCache.update(Collections.singletonList(accountName));
Drawable profileImage = mProfileDataCache.getProfileDataOrDefault(accountName).getImage();
mToolbarManager.enableExperimentalButton(view -> {
PreferencesLauncher.launchSettingsPage(mContext, SyncAndServicesPreferences.class);
......@@ -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.
*/
......@@ -108,5 +166,13 @@ class IdentityDiscController implements ProfileDataCache.Observer {
mProfileDataCache.removeObserver(this);
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
mActionModeController = new ActionModeController(mActivity, mActionBarDelegate);
mActionModeController.setCustomSelectionActionModeCallback(mToolbarActionModeCallback);
mIdentityDiscController = new IdentityDiscController(activity, this);
mIdentityDiscController =
new IdentityDiscController(activity, this, activity.getLifecycleDispatcher());
mToolbar.setPaintInvalidator(invalidator);
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