Commit 0b5a431b authored by Iulia Harasim's avatar Iulia Harasim Committed by Commit Bot

[Android] Add SigninPromoMediator and wire promo in Settings page

This CL adds SinginPromoMediator which is used to configure the signin
promo. This class is then used in SigninPreference, making the promo
visibile in the Settings page.

Bug: 737743
Change-Id: I7f5587b32a377db603cf536f8cb1cd9ba8851fdb
Reviewed-on: https://chromium-review.googlesource.com/576169Reviewed-by: default avatarBernhard Bauer <bauerb@chromium.org>
Commit-Queue: Iulia Harasim <iuliah@google.com>
Cr-Commit-Position: refs/heads/master@{#488673}
parent 8acbe9a6
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
<org.chromium.chrome.browser.preferences.SignInPreference <org.chromium.chrome.browser.preferences.SignInPreference
android:key="sign_in" android:key="sign_in"
android:layout="@layout/account_management_account_row"
android:title="@string/sign_in_to_chrome" /> android:title="@string/sign_in_to_chrome" />
<PreferenceCategory <PreferenceCategory
......
...@@ -150,6 +150,7 @@ public abstract class ChromeFeatureList { ...@@ -150,6 +150,7 @@ public abstract class ChromeFeatureList {
public static final String ANDROID_PAY_INTEGRATION_V1 = "AndroidPayIntegrationV1"; public static final String ANDROID_PAY_INTEGRATION_V1 = "AndroidPayIntegrationV1";
public static final String ANDROID_PAY_INTEGRATION_V2 = "AndroidPayIntegrationV2"; public static final String ANDROID_PAY_INTEGRATION_V2 = "AndroidPayIntegrationV2";
public static final String ANDROID_PAYMENT_APPS = "AndroidPaymentApps"; public static final String ANDROID_PAYMENT_APPS = "AndroidPaymentApps";
public static final String ANDROID_SIGNIN_PROMOS = "AndroidSigninPromos";
public static final String AUTOFILL_SCAN_CARDHOLDER_NAME = "AutofillScanCardholderName"; public static final String AUTOFILL_SCAN_CARDHOLDER_NAME = "AutofillScanCardholderName";
public static final String CCT_BACKGROUND_TAB = "CCTBackgroundTab"; public static final String CCT_BACKGROUND_TAB = "CCTBackgroundTab";
public static final String CCT_EXTERNAL_LINK_HANDLING = "CCTExternalLinkHandling"; public static final String CCT_EXTERNAL_LINK_HANDLING = "CCTExternalLinkHandling";
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
package org.chromium.chrome.browser.preferences; package org.chromium.chrome.browser.preferences;
import android.accounts.Account;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.preference.Preference; import android.preference.Preference;
...@@ -15,6 +16,7 @@ import android.view.View; ...@@ -15,6 +16,7 @@ import android.view.View;
import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor; import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor;
import org.chromium.chrome.browser.firstrun.ProfileDataCache;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.profiles.ProfileDownloader; import org.chromium.chrome.browser.profiles.ProfileDownloader;
import org.chromium.chrome.browser.signin.AccountManagementFragment; import org.chromium.chrome.browser.signin.AccountManagementFragment;
...@@ -22,9 +24,12 @@ import org.chromium.chrome.browser.signin.AccountSigninActivity; ...@@ -22,9 +24,12 @@ import org.chromium.chrome.browser.signin.AccountSigninActivity;
import org.chromium.chrome.browser.signin.SigninAccessPoint; import org.chromium.chrome.browser.signin.SigninAccessPoint;
import org.chromium.chrome.browser.signin.SigninManager; import org.chromium.chrome.browser.signin.SigninManager;
import org.chromium.chrome.browser.signin.SigninManager.SignInAllowedObserver; import org.chromium.chrome.browser.signin.SigninManager.SignInAllowedObserver;
import org.chromium.chrome.browser.signin.SigninPromoController;
import org.chromium.chrome.browser.signin.SigninPromoView;
import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.chrome.browser.sync.ProfileSyncService;
import org.chromium.chrome.browser.sync.ProfileSyncService.SyncStateChangedListener; import org.chromium.chrome.browser.sync.ProfileSyncService.SyncStateChangedListener;
import org.chromium.chrome.browser.util.ViewUtils; import org.chromium.chrome.browser.util.ViewUtils;
import org.chromium.components.signin.AccountManagerFacade;
import org.chromium.components.signin.ChromeSigninController; import org.chromium.components.signin.ChromeSigninController;
import org.chromium.components.sync.AndroidSyncSettings; import org.chromium.components.sync.AndroidSyncSettings;
...@@ -36,8 +41,9 @@ import org.chromium.components.sync.AndroidSyncSettings; ...@@ -36,8 +41,9 @@ import org.chromium.components.sync.AndroidSyncSettings;
public class SignInPreference extends Preference public class SignInPreference extends Preference
implements SignInAllowedObserver, ProfileDownloader.Observer, implements SignInAllowedObserver, ProfileDownloader.Observer,
AndroidSyncSettings.AndroidSyncSettingsObserver, SyncStateChangedListener { AndroidSyncSettings.AndroidSyncSettingsObserver, SyncStateChangedListener {
private boolean mViewEnabled;
private boolean mShowingPromo; private boolean mShowingPromo;
private boolean mViewEnabled;
private SigninPromoController mSigninPromoController;
/** /**
* Constructor for inflating from XML. * Constructor for inflating from XML.
...@@ -84,18 +90,14 @@ public class SignInPreference extends Preference ...@@ -84,18 +90,14 @@ public class SignInPreference extends Preference
String accountName = ChromeSigninController.get().getSignedInAccountName(); String accountName = ChromeSigninController.get().getSignedInAccountName();
if (SigninManager.get(getContext()).isSigninDisabledByPolicy()) { if (SigninManager.get(getContext()).isSigninDisabledByPolicy()) {
setupSigninDisabled(); setupSigninDisabled();
mShowingPromo = false;
} else if (accountName == null) { } else if (accountName == null) {
setupNotSignedIn(); if (SigninPromoController.shouldShowPromo()) {
setupNewPromo();
if (!mShowingPromo) { } else {
// This user action should be recorded when message with sign-in prompt is shown setupOldPromo();
RecordUserAction.record("Signin_Impression_FromSettings");
} }
mShowingPromo = true;
} else { } else {
setupSignedIn(accountName); setupSignedIn(accountName);
mShowingPromo = false;
} }
setOnPreferenceClickListener(new OnPreferenceClickListener() { setOnPreferenceClickListener(new OnPreferenceClickListener() {
...@@ -108,24 +110,64 @@ public class SignInPreference extends Preference ...@@ -108,24 +110,64 @@ public class SignInPreference extends Preference
} }
private void setupSigninDisabled() { private void setupSigninDisabled() {
setLayoutResource(R.layout.account_management_account_row);
setTitle(R.string.sign_in_to_chrome); setTitle(R.string.sign_in_to_chrome);
setSummary(R.string.sign_in_to_chrome_disabled_summary); setSummary(R.string.sign_in_to_chrome_disabled_summary);
setFragment(null); setFragment(null);
setIcon(ManagedPreferencesUtils.getManagedByEnterpriseIconId()); setIcon(ManagedPreferencesUtils.getManagedByEnterpriseIconId());
setWidgetLayoutResource(0); setWidgetLayoutResource(0);
setViewEnabled(false); setViewEnabled(false);
mSigninPromoController = null;
mShowingPromo = false;
}
private void setupNewPromo() {
setLayoutResource(R.layout.custom_preference);
setTitle("");
setSummary("");
setFragment(null);
setIcon(null);
setWidgetLayoutResource(R.layout.signin_promo_view);
setViewEnabled(true);
Account[] accounts = AccountManagerFacade.get().tryGetGoogleAccounts();
String defaultAccountName = accounts.length == 0 ? null : accounts[0].name;
if (mSigninPromoController == null) {
ProfileDataCache profileDataCache =
new ProfileDataCache(getContext(), Profile.getLastUsedProfile());
mSigninPromoController =
new SigninPromoController(profileDataCache, SigninAccessPoint.SETTINGS);
mSigninPromoController.setAccountName(defaultAccountName);
mSigninPromoController.recordSigninPromoImpression();
} else {
mSigninPromoController.setAccountName(defaultAccountName);
}
mShowingPromo = true;
notifyChanged();
} }
private void setupNotSignedIn() { private void setupOldPromo() {
setLayoutResource(R.layout.account_management_account_row);
setTitle(R.string.sign_in_to_chrome); setTitle(R.string.sign_in_to_chrome);
setSummary(R.string.sign_in_to_chrome_summary); setSummary(R.string.sign_in_to_chrome_summary);
setFragment(null); setFragment(null);
setIcon(AppCompatResources.getDrawable(getContext(), R.drawable.logo_avatar_anonymous)); setIcon(AppCompatResources.getDrawable(getContext(), R.drawable.logo_avatar_anonymous));
setWidgetLayoutResource(0); setWidgetLayoutResource(0);
setViewEnabled(true); setViewEnabled(true);
mSigninPromoController = null;
if (!mShowingPromo) {
RecordUserAction.record("Signin_Impression_FromSettings");
}
mShowingPromo = true;
} }
private void setupSignedIn(String accountName) { private void setupSignedIn(String accountName) {
setLayoutResource(R.layout.account_management_account_row);
String title = AccountManagementFragment.getCachedUserName(accountName); String title = AccountManagementFragment.getCachedUserName(accountName);
if (title == null) { if (title == null) {
Profile profile = Profile.getLastUsedProfile(); Profile profile = Profile.getLastUsedProfile();
...@@ -141,11 +183,11 @@ public class SignInPreference extends Preference ...@@ -141,11 +183,11 @@ public class SignInPreference extends Preference
setSummary(SyncPreference.getSyncStatusSummary(getContext())); setSummary(SyncPreference.getSyncStatusSummary(getContext()));
setFragment(AccountManagementFragment.class.getName()); setFragment(AccountManagementFragment.class.getName());
setIcon(AccountManagementFragment.getUserPicture(getContext(), accountName)); setIcon(AccountManagementFragment.getUserPicture(getContext(), accountName));
setWidgetLayoutResource( setWidgetLayoutResource(
SyncPreference.showSyncErrorIcon(getContext()) ? R.layout.sync_error_widget : 0); SyncPreference.showSyncErrorIcon(getContext()) ? R.layout.sync_error_widget : 0);
setViewEnabled(true); setViewEnabled(true);
mSigninPromoController = null;
mShowingPromo = false;
} }
// This just changes visual representation. Actual enabled flag in preference stays // This just changes visual representation. Actual enabled flag in preference stays
...@@ -159,9 +201,13 @@ public class SignInPreference extends Preference ...@@ -159,9 +201,13 @@ public class SignInPreference extends Preference
} }
@Override @Override
protected void onBindView(View view) { protected void onBindView(final View view) {
super.onBindView(view); super.onBindView(view);
ViewUtils.setEnabledRecursive(view, mViewEnabled); ViewUtils.setEnabledRecursive(view, mViewEnabled);
if (mSigninPromoController != null) {
SigninPromoView signinPromoView = view.findViewById(R.id.signin_promo_view_container);
mSigninPromoController.setupSigninPromoView(getContext(), signinPromoView, null);
}
} }
// ProfileSyncServiceListener implementation: // ProfileSyncServiceListener implementation:
......
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.signin;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.drawable.Drawable;
import android.support.annotation.DimenRes;
import android.view.View;
import android.view.ViewGroup;
import org.chromium.base.ContextUtils;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.firstrun.ProfileDataCache;
import javax.annotation.Nullable;
/**
* A mediator for configuring the sign in promo. It sets up the sign in promo depending on the
* context: whether there are any Google accounts on the device which have been previously signed in
* or not.
*/
public class SigninPromoController {
/**
* Receives notifications when user clicks close button in the promo.
*/
public interface OnDismissListener {
/**
* Action to be performed when the promo is being dismissed.
*/
void onDismiss();
}
private static final String SIGNIN_PROMO_IMPRESSIONS_COUNT = "signin_promo_impressions_count";
private static final int MAX_IMPRESSIONS = 20;
private String mAccountName;
private final ProfileDataCache mProfileDataCache;
private final @AccountSigninActivity.AccessPoint int mAccessPoint;
/**
* Determines whether the promo should be shown to the user or not.
* @return true if the promo is to be shown and false otherwise.
*/
public static boolean shouldShowPromo() {
if (!ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_SIGNIN_PROMOS)) {
return false;
}
int numImpressions =
ContextUtils.getAppSharedPreferences().getInt(SIGNIN_PROMO_IMPRESSIONS_COUNT, 0);
return numImpressions < MAX_IMPRESSIONS;
}
/**
* Creates a new SigninPromoMediator.
* @param profileDataCache The profile data cache for the latest used account on the device.
* @param accessPoint Specifies the AccessPoint from which the promo is to be shown.
*/
public SigninPromoController(
ProfileDataCache profileDataCache, @AccountSigninActivity.AccessPoint int accessPoint) {
mProfileDataCache = profileDataCache;
mAccessPoint = accessPoint;
}
/**
* Records an impression for the promo.
*/
public void recordSigninPromoImpression() {
SharedPreferences preferences = ContextUtils.getAppSharedPreferences();
int numImpressions = preferences.getInt(SIGNIN_PROMO_IMPRESSIONS_COUNT, 0);
preferences.edit().putInt(SIGNIN_PROMO_IMPRESSIONS_COUNT, numImpressions + 1).apply();
RecordUserAction.record("Signin_Impression_FromSettings");
// TODO(iuliah): Add Signin_Impression_WithAccounts recording
// This method is later going to record impressions for whether the promo was configured
// to be in the hot state (there are accounts which are currently singed in on the device)
// or in the cold state, depending on the value of mAccountName.
}
/**
* Configures the signin promo view.
* @param view The view in which the promo will be added.
* @param onDismissListener Listener which handles the action of dismissing the promo. A null
* onDismissListener marks that the promo is not dismissible and as a result the close
* button is hidden.
*/
public void setupSigninPromoView(Context context, SigninPromoView view,
@Nullable final OnDismissListener onDismissListener) {
if (mAccountName == null) {
setupColdState(context, view);
} else {
setupHotState(context, view);
}
if (onDismissListener != null) {
view.getDismissButton().setVisibility(View.VISIBLE);
view.getDismissButton().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onDismissListener.onDismiss();
}
});
} else {
view.getDismissButton().setVisibility(View.GONE);
}
}
/**
* Sets the the default account found on the device.
* @param accountName The name of the default account found on the device. Can be null if there
* are no accounts signed in on the device.
*/
public void setAccountName(@Nullable String accountName) {
mAccountName = accountName;
}
private void setupColdState(final Context context, SigninPromoView view) {
view.getImage().setImageResource(R.drawable.chrome_sync_logo);
setImageSize(context, view, R.dimen.signin_promo_cold_state_image_size);
view.getSigninButton().setText(R.string.sign_in_to_chrome);
view.getSigninButton().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AccountSigninActivity.startAccountSigninActivity(context, mAccessPoint);
}
});
view.getChooseAccountButton().setVisibility(View.GONE);
}
private void setupHotState(final Context context, SigninPromoView view) {
// TODO (iuliah): Subscribe to ProfileDataCache
Drawable accountImage = mProfileDataCache.getImage(mAccountName);
view.getImage().setImageDrawable(accountImage);
setImageSize(context, view, R.dimen.signin_promo_account_image_size);
String accountTitle = getAccountTitle();
String signinButtonText =
context.getString(R.string.signin_promo_continue_as, accountTitle);
view.getSigninButton().setText(signinButtonText);
view.getSigninButton().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AccountSigninActivity.startAccountSigninActivity(context, mAccessPoint);
// TODO(iuliah): use confirmation-only entry point in AccountSigninActivity
// as soon as it is available
}
});
String chooseAccountButtonText =
context.getString(R.string.signin_promo_choose_account, mAccountName);
view.getChooseAccountButton().setText(chooseAccountButtonText);
view.getChooseAccountButton().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AccountSigninActivity.startAccountSigninActivity(context, mAccessPoint);
}
});
view.getChooseAccountButton().setVisibility(View.VISIBLE);
}
private void setImageSize(Context context, SigninPromoView view, @DimenRes int dimenResId) {
ViewGroup.LayoutParams layoutParams = view.getImage().getLayoutParams();
layoutParams.height = context.getResources().getDimensionPixelSize(dimenResId);
layoutParams.width = context.getResources().getDimensionPixelSize(dimenResId);
view.getImage().setLayoutParams(layoutParams);
}
private String getAccountTitle() {
String title = mProfileDataCache.getFullName(mAccountName);
return title == null ? mAccountName : title;
}
}
...@@ -1008,6 +1008,7 @@ chrome_java_sources = [ ...@@ -1008,6 +1008,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/signin/SigninHelper.java", "java/src/org/chromium/chrome/browser/signin/SigninHelper.java",
"java/src/org/chromium/chrome/browser/signin/SigninInvestigator.java", "java/src/org/chromium/chrome/browser/signin/SigninInvestigator.java",
"java/src/org/chromium/chrome/browser/signin/SigninManager.java", "java/src/org/chromium/chrome/browser/signin/SigninManager.java",
"java/src/org/chromium/chrome/browser/signin/SigninPromoController.java",
"java/src/org/chromium/chrome/browser/signin/SigninPromoUtil.java", "java/src/org/chromium/chrome/browser/signin/SigninPromoUtil.java",
"java/src/org/chromium/chrome/browser/signin/SigninPromoView.java", "java/src/org/chromium/chrome/browser/signin/SigninPromoView.java",
"java/src/org/chromium/chrome/browser/snackbar/BottomContainer.java", "java/src/org/chromium/chrome/browser/snackbar/BottomContainer.java",
......
...@@ -3237,6 +3237,13 @@ const FeatureEntry kFeatureEntries[] = { ...@@ -3237,6 +3237,13 @@ const FeatureEntry kFeatureEntries[] = {
FEATURE_VALUE_TYPE(chrome::android::kReaderModeInCCT)}, FEATURE_VALUE_TYPE(chrome::android::kReaderModeInCCT)},
#endif // !defined(OS_ANDROID) #endif // !defined(OS_ANDROID)
#if defined(OS_ANDROID)
{"enable-android-signin-promos",
flag_descriptions::kAndroidSigninPromosName,
flag_descriptions::kAndroidSigninPromosDescription, kOsAndroid,
FEATURE_VALUE_TYPE(chrome::android::kAndroidSigninPromos)},
#endif // OS_ANDROID
// NOTE: Adding new command-line switches requires adding corresponding // NOTE: Adding new command-line switches requires adding corresponding
// entries to enum "LoginCustomFlags" in histograms/enums.xml. See note in // entries to enum "LoginCustomFlags" in histograms/enums.xml. See note in
// enums.xml and don't forget to run AboutFlagsHistogramTest unit test. // enums.xml and don't forget to run AboutFlagsHistogramTest unit test.
......
...@@ -51,6 +51,7 @@ const base::Feature* kFeaturesExposedToJava[] = { ...@@ -51,6 +51,7 @@ const base::Feature* kFeaturesExposedToJava[] = {
&kAndroidPayIntegrationV1, &kAndroidPayIntegrationV1,
&kAndroidPayIntegrationV2, &kAndroidPayIntegrationV2,
&kAndroidPaymentApps, &kAndroidPaymentApps,
&kAndroidSigninPromos,
&kCCTBackgroundTab, &kCCTBackgroundTab,
&kCCTExternalLinkHandling, &kCCTExternalLinkHandling,
&kCCTPostMessageAPI, &kCCTPostMessageAPI,
...@@ -133,6 +134,9 @@ const base::Feature kAndroidPayIntegrationV2{"AndroidPayIntegrationV2", ...@@ -133,6 +134,9 @@ const base::Feature kAndroidPayIntegrationV2{"AndroidPayIntegrationV2",
const base::Feature kAndroidPaymentApps{"AndroidPaymentApps", const base::Feature kAndroidPaymentApps{"AndroidPaymentApps",
base::FEATURE_ENABLED_BY_DEFAULT}; base::FEATURE_ENABLED_BY_DEFAULT};
const base::Feature kAndroidSigninPromos{"AndroidSigninPromos",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kCCTBackgroundTab{"CCTBackgroundTab", const base::Feature kCCTBackgroundTab{"CCTBackgroundTab",
base::FEATURE_DISABLED_BY_DEFAULT}; base::FEATURE_DISABLED_BY_DEFAULT};
......
...@@ -16,6 +16,7 @@ namespace android { ...@@ -16,6 +16,7 @@ namespace android {
extern const base::Feature kAndroidPayIntegrationV1; extern const base::Feature kAndroidPayIntegrationV1;
extern const base::Feature kAndroidPayIntegrationV2; extern const base::Feature kAndroidPayIntegrationV2;
extern const base::Feature kAndroidPaymentApps; extern const base::Feature kAndroidPaymentApps;
extern const base::Feature kAndroidSigninPromos;
extern const base::Feature kCCTBackgroundTab; extern const base::Feature kCCTBackgroundTab;
extern const base::Feature kCCTExternalLinkHandling; extern const base::Feature kCCTExternalLinkHandling;
extern const base::Feature kCCTPostMessageAPI; extern const base::Feature kCCTPostMessageAPI;
......
...@@ -1390,6 +1390,11 @@ const char kAndroidPaymentAppsName[] = "Android payment apps"; ...@@ -1390,6 +1390,11 @@ const char kAndroidPaymentAppsName[] = "Android payment apps";
const char kAndroidPaymentAppsDescription[] = const char kAndroidPaymentAppsDescription[] =
"Enable third party Android apps to integrate as payment apps"; "Enable third party Android apps to integrate as payment apps";
const char kAndroidSigninPromosName[] = "Signin promos for Android.";
const char kAndroidSigninPromosDescription[] =
"New signin promos for Android which will be displayed in content "
"suggestions, Settings, Bookmarks and Recent Tabs.";
const char kAutofillAccessoryViewName[] = const char kAutofillAccessoryViewName[] =
"Autofill suggestions as keyboard accessory view"; "Autofill suggestions as keyboard accessory view";
const char kAutofillAccessoryViewDescription[] = const char kAutofillAccessoryViewDescription[] =
......
...@@ -864,6 +864,9 @@ extern const char kAndroidAutofillAccessibilityDescription[]; ...@@ -864,6 +864,9 @@ extern const char kAndroidAutofillAccessibilityDescription[];
extern const char kAndroidPaymentAppsName[]; extern const char kAndroidPaymentAppsName[];
extern const char kAndroidPaymentAppsDescription[]; extern const char kAndroidPaymentAppsDescription[];
extern const char kAndroidSigninPromosName[];
extern const char kAndroidSigninPromosDescription[];
extern const char kAutofillAccessoryViewName[]; extern const char kAutofillAccessoryViewName[];
extern const char kAutofillAccessoryViewDescription[]; extern const char kAutofillAccessoryViewDescription[];
......
...@@ -22881,6 +22881,7 @@ uploading your change for review. These are checked by presubmit scripts. ...@@ -22881,6 +22881,7 @@ uploading your change for review. These are checked by presubmit scripts.
<int value="-1126217973" label="IdleTimeSpellChecking:disabled"/> <int value="-1126217973" label="IdleTimeSpellChecking:disabled"/>
<int value="-1125133283" label="disable-threaded-scrolling"/> <int value="-1125133283" label="disable-threaded-scrolling"/>
<int value="-1119700637" label="ui-disable-partial-swap"/> <int value="-1119700637" label="ui-disable-partial-swap"/>
<int value="-1112782121" label="AndroidSigninPromos:disabled"/>
<int value="-1107762575" label="enable-data-reduction-proxy-config-client"/> <int value="-1107762575" label="enable-data-reduction-proxy-config-client"/>
<int value="-1102212525" label="enable-tcp-fastopen"/> <int value="-1102212525" label="enable-tcp-fastopen"/>
<int value="-1099142083" label="V8Ignition:disabled"/> <int value="-1099142083" label="V8Ignition:disabled"/>
...@@ -23375,6 +23376,7 @@ from previous Chrome versions. ...@@ -23375,6 +23376,7 @@ from previous Chrome versions.
<int value="593707592" label="disable-network-portal-notification"/> <int value="593707592" label="disable-network-portal-notification"/>
<int value="596106994" label="CustomFeedbackUi:enabled"/> <int value="596106994" label="CustomFeedbackUi:enabled"/>
<int value="598827460" label="enable-roboto-font-ui"/> <int value="598827460" label="enable-roboto-font-ui"/>
<int value="600037637" label="AndroidSigninPromos:enabled"/>
<int value="602117675" label="NTPBookmarkSuggestions:enabled"/> <int value="602117675" label="NTPBookmarkSuggestions:enabled"/>
<int value="603326800" label="UsePasswordSeparatedSigninFlow:enabled"/> <int value="603326800" label="UsePasswordSeparatedSigninFlow:enabled"/>
<int value="603988014" label="NetworkService:enabled"/> <int value="603988014" label="NetworkService:enabled"/>
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