| Index: chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
|
| index a57bb4d60329c84147f516220cc6a5a48511c4ce..452f352bcae891af960495544ed87c6955470866 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
|
| @@ -44,6 +44,13 @@ public abstract class FirstRunFlowSequencer {
|
| private final Activity mActivity;
|
| private final Bundle mLaunchProperties;
|
|
|
| + // The following are initialized via initializeSharedState().
|
| + private boolean mIsAndroidEduDevice;
|
| + private boolean mHasChildAccount;
|
| + private Account[] mGoogleAccounts;
|
| + private boolean mOnlyOneAccount;
|
| + private boolean mForceEduSignIn;
|
| +
|
| /**
|
| * Callback that is called once the flow is determined.
|
| * If the properties is null, the First Run experience needs to finish and
|
| @@ -68,15 +75,11 @@ public abstract class FirstRunFlowSequencer {
|
| return;
|
| }
|
|
|
| - if (!mLaunchProperties.getBoolean(FirstRunActivity.EXTRA_USE_FRE_FLOW_SEQUENCER)) {
|
| - onFlowIsKnown(mLaunchProperties);
|
| - return;
|
| - }
|
| -
|
| new AndroidEduAndChildAccountHelper() {
|
| @Override
|
| public void onParametersReady() {
|
| - processFreEnvironment(isAndroidEduDevice(), hasChildAccount());
|
| + initializeSharedState(isAndroidEduDevice(), hasChildAccount());
|
| + processFreEnvironmentPreNative();
|
| }
|
| }.start(mActivity.getApplicationContext());
|
| }
|
| @@ -135,7 +138,17 @@ public abstract class FirstRunFlowSequencer {
|
| mActivity.getApplicationContext(), true);
|
| }
|
|
|
| - void processFreEnvironment(boolean androidEduDevice, boolean hasChildAccount) {
|
| + void initializeSharedState(boolean isAndroidEduDevice, boolean hasChildAccount) {
|
| + mIsAndroidEduDevice = isAndroidEduDevice;
|
| + mHasChildAccount = hasChildAccount;
|
| + mGoogleAccounts = getGoogleAccounts();
|
| + mOnlyOneAccount = mGoogleAccounts.length == 1;
|
| + // EDU devices should always have exactly 1 google account, which will be automatically
|
| + // signed-in. All FRE screens are skipped in this case.
|
| + mForceEduSignIn = mIsAndroidEduDevice && mOnlyOneAccount && !isSignedIn();
|
| + }
|
| +
|
| + void processFreEnvironmentPreNative() {
|
| if (isFirstRunFlowComplete()) {
|
| assert isFirstRunEulaAccepted();
|
| // We do not need any interactive FRE.
|
| @@ -143,59 +156,69 @@ public abstract class FirstRunFlowSequencer {
|
| return;
|
| }
|
|
|
| + if (!mLaunchProperties.getBoolean(FirstRunActivity.EXTRA_USE_FRE_FLOW_SEQUENCER)) {
|
| + // If EXTRA_USE_FRE_FLOW_SEQUENCER is not set, it means we should use the properties as
|
| + // provided instead of setting them up. However, the properties as provided may not yet
|
| + // have post-native properties computed, so the Runnable still needs to be passed.
|
| + onFlowIsKnown(mLaunchProperties);
|
| + return;
|
| + }
|
| +
|
| Bundle freProperties = new Bundle();
|
| freProperties.putAll(mLaunchProperties);
|
| freProperties.remove(FirstRunActivity.EXTRA_USE_FRE_FLOW_SEQUENCER);
|
|
|
| - Account[] googleAccounts = getGoogleAccounts();
|
| - boolean onlyOneAccount = googleAccounts.length == 1;
|
| -
|
| - // EDU devices should always have exactly 1 google account, which will be automatically
|
| - // signed-in. All FRE screens are skipped in this case.
|
| - boolean forceEduSignIn = androidEduDevice && onlyOneAccount && !isSignedIn();
|
| -
|
| // In the full FRE we always show the Welcome page, except on EDU devices.
|
| - boolean showWelcomePage = !forceEduSignIn;
|
| + boolean showWelcomePage = !mForceEduSignIn;
|
| freProperties.putBoolean(FirstRunActivity.SHOW_WELCOME_PAGE, showWelcomePage);
|
| + freProperties.putBoolean(AccountFirstRunFragment.IS_CHILD_ACCOUNT, mHasChildAccount);
|
| +
|
| + // Set a boolean to indicate we need to do post native setup via the runnable below.
|
| + freProperties.putBoolean(FirstRunActivity.POST_NATIVE_SETUP_NEEDED, true);
|
|
|
| // Initialize usage and crash reporting according to the default value.
|
| // The user can explicitly enable or disable the reporting on the Welcome page.
|
| // This is controlled by the administrator via a policy on EDU devices.
|
| setDefaultMetricsAndCrashReporting();
|
|
|
| - // We show the sign-in page if sync is allowed, and not signed in, and this is not an EDU
|
| - // device, and
|
| + onFlowIsKnown(freProperties);
|
| + if (mHasChildAccount || mForceEduSignIn) {
|
| + // Child and Edu forced signins are processed independently.
|
| + setFirstRunFlowSignInComplete();
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Called onNativeInitialized() a given flow as completed.
|
| + * @param activity An activity.
|
| + * @param data Resulting FRE properties bundle.
|
| + */
|
| + public void onNativeInitialized(Bundle freProperties) {
|
| + if (!freProperties.getBoolean(FirstRunActivity.POST_NATIVE_SETUP_NEEDED)) return;
|
| +
|
| + // We show the sign-in page if sync is allowed, and not signed in, and this is not
|
| + // an EDU device, and
|
| // - no "skip the first use hints" is set, or
|
| // - "skip the first use hints" is set, but there is at least one account.
|
| - final boolean offerSignInOk = isSyncAllowed()
|
| - && !isSignedIn()
|
| - && !forceEduSignIn
|
| - && (!shouldSkipFirstUseHints() || googleAccounts.length > 0);
|
| + boolean offerSignInOk = isSyncAllowed() && !isSignedIn() && !mForceEduSignIn
|
| + && (!shouldSkipFirstUseHints() || mGoogleAccounts.length > 0);
|
| freProperties.putBoolean(FirstRunActivity.SHOW_SIGNIN_PAGE, offerSignInOk);
|
| -
|
| - if (offerSignInOk || forceEduSignIn) {
|
| + if (offerSignInOk || mForceEduSignIn) {
|
| // If the user has accepted the ToS in the Setup Wizard and there is exactly
|
| // one account, or if the device has a child account, or if the device is an
|
| // Android EDU device and there is exactly one account, preselect the sign-in
|
| // account and force the selection if necessary.
|
| - if ((hasAnyUserSeenToS() && onlyOneAccount) || hasChildAccount || forceEduSignIn) {
|
| - freProperties.putString(AccountFirstRunFragment.FORCE_SIGNIN_ACCOUNT_TO,
|
| - googleAccounts[0].name);
|
| + if ((hasAnyUserSeenToS() && mOnlyOneAccount) || mHasChildAccount || mForceEduSignIn) {
|
| + freProperties.putString(
|
| + AccountFirstRunFragment.FORCE_SIGNIN_ACCOUNT_TO, mGoogleAccounts[0].name);
|
| freProperties.putBoolean(AccountFirstRunFragment.PRESELECT_BUT_ALLOW_TO_CHANGE,
|
| - !forceEduSignIn && !hasChildAccount);
|
| + !mForceEduSignIn && !mHasChildAccount);
|
| }
|
| }
|
|
|
| - freProperties.putBoolean(AccountFirstRunFragment.IS_CHILD_ACCOUNT, hasChildAccount);
|
| -
|
| - freProperties.putBoolean(FirstRunActivity.SHOW_DATA_REDUCTION_PAGE,
|
| - shouldShowDataReductionPage());
|
| -
|
| - onFlowIsKnown(freProperties);
|
| - if (hasChildAccount || forceEduSignIn) {
|
| - // Child and Edu forced signins are processed independently.
|
| - setFirstRunFlowSignInComplete();
|
| - }
|
| + freProperties.putBoolean(
|
| + FirstRunActivity.SHOW_DATA_REDUCTION_PAGE, shouldShowDataReductionPage());
|
| + freProperties.remove(FirstRunActivity.POST_NATIVE_SETUP_NEEDED);
|
| }
|
|
|
| /**
|
|
|