Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.chrome.browser.firstrun; | 5 package org.chromium.chrome.browser.firstrun; |
| 6 | 6 |
| 7 import android.accounts.Account; | 7 import android.accounts.Account; |
| 8 import android.app.Activity; | 8 import android.app.Activity; |
| 9 import android.app.PendingIntent; | 9 import android.app.PendingIntent; |
| 10 import android.content.Context; | 10 import android.content.Context; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 42 private static final int FIRST_RUN_EXPERIENCE_REQUEST_CODE = 101; | 42 private static final int FIRST_RUN_EXPERIENCE_REQUEST_CODE = 101; |
| 43 | 43 |
| 44 private final Activity mActivity; | 44 private final Activity mActivity; |
| 45 private final Bundle mLaunchProperties; | 45 private final Bundle mLaunchProperties; |
| 46 | 46 |
| 47 /** | 47 /** |
| 48 * Callback that is called once the flow is determined. | 48 * Callback that is called once the flow is determined. |
| 49 * If the properties is null, the First Run experience needs to finish and | 49 * If the properties is null, the First Run experience needs to finish and |
| 50 * restart the original intent if necessary. | 50 * restart the original intent if necessary. |
| 51 * @param freProperties Properties to be used in the First Run activity, or null. | 51 * @param freProperties Properties to be used in the First Run activity, or null. |
| 52 * @param setUpPropertiesPostNative Runnable that should be run to finish in itialization of | |
| 53 * freProperties after native initialization. | |
|
Ted C
2016/12/01 21:59:06
should be aligned with "Runnable that..."
Alexei Svitkine (slow)
2016/12/02 18:34:54
Removed param.
| |
| 52 */ | 54 */ |
| 53 public abstract void onFlowIsKnown(Bundle freProperties); | 55 public abstract void onFlowIsKnown(Bundle freProperties, Runnable setUpPrope rtiesPostNative); |
| 54 | 56 |
| 55 public FirstRunFlowSequencer(Activity activity, Bundle launcherProvidedPrope rties) { | 57 public FirstRunFlowSequencer(Activity activity, Bundle launcherProvidedPrope rties) { |
| 56 mActivity = activity; | 58 mActivity = activity; |
| 57 mLaunchProperties = launcherProvidedProperties; | 59 mLaunchProperties = launcherProvidedProperties; |
| 58 } | 60 } |
| 59 | 61 |
| 60 /** | 62 /** |
| 61 * Starts determining parameters for the First Run. | 63 * Starts determining parameters for the First Run. |
| 62 * Once finished, calls onFlowIsKnown(). | 64 * Once finished, calls onFlowIsKnown(). |
| 63 */ | 65 */ |
| 64 public void start() { | 66 public void start() { |
| 65 if (CommandLine.getInstance().hasSwitch(ChromeSwitches.DISABLE_FIRST_RUN _EXPERIENCE) | 67 if (CommandLine.getInstance().hasSwitch(ChromeSwitches.DISABLE_FIRST_RUN _EXPERIENCE) |
| 66 || ApiCompatibilityUtils.isDemoUser(mActivity)) { | 68 || ApiCompatibilityUtils.isDemoUser(mActivity)) { |
| 67 onFlowIsKnown(null); | 69 onFlowIsKnown(null, null); |
| 68 return; | 70 return; |
| 69 } | 71 } |
| 70 | 72 |
| 71 if (!mLaunchProperties.getBoolean(FirstRunActivity.EXTRA_USE_FRE_FLOW_SE QUENCER)) { | |
| 72 onFlowIsKnown(mLaunchProperties); | |
| 73 return; | |
| 74 } | |
| 75 | |
| 76 new AndroidEduAndChildAccountHelper() { | 73 new AndroidEduAndChildAccountHelper() { |
| 77 @Override | 74 @Override |
| 78 public void onParametersReady() { | 75 public void onParametersReady() { |
| 79 processFreEnvironment(isAndroidEduDevice(), hasChildAccount()); | 76 processFreEnvironment(isAndroidEduDevice(), hasChildAccount()); |
| 80 } | 77 } |
| 81 }.start(mActivity.getApplicationContext()); | 78 }.start(mActivity.getApplicationContext()); |
| 82 } | 79 } |
| 83 | 80 |
| 84 @VisibleForTesting | 81 @VisibleForTesting |
| 85 protected boolean isFirstRunFlowComplete() { | 82 protected boolean isFirstRunFlowComplete() { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 128 PrivacyPreferencesManager.getInstance().setUsageAndCrashReporting( | 125 PrivacyPreferencesManager.getInstance().setUsageAndCrashReporting( |
| 129 FirstRunActivity.DEFAULT_METRICS_AND_CRASH_REPORTING); | 126 FirstRunActivity.DEFAULT_METRICS_AND_CRASH_REPORTING); |
| 130 } | 127 } |
| 131 | 128 |
| 132 @VisibleForTesting | 129 @VisibleForTesting |
| 133 protected void setFirstRunFlowSignInComplete() { | 130 protected void setFirstRunFlowSignInComplete() { |
| 134 FirstRunSignInProcessor.setFirstRunFlowSignInComplete( | 131 FirstRunSignInProcessor.setFirstRunFlowSignInComplete( |
| 135 mActivity.getApplicationContext(), true); | 132 mActivity.getApplicationContext(), true); |
| 136 } | 133 } |
| 137 | 134 |
| 138 void processFreEnvironment(boolean androidEduDevice, boolean hasChildAccount ) { | 135 void processFreEnvironment(boolean androidEduDevice, final boolean hasChildA ccount) { |
| 139 if (isFirstRunFlowComplete()) { | 136 if (isFirstRunFlowComplete()) { |
| 140 assert isFirstRunEulaAccepted(); | 137 assert isFirstRunEulaAccepted(); |
| 141 // We do not need any interactive FRE. | 138 // We do not need any interactive FRE. |
| 142 onFlowIsKnown(null); | 139 onFlowIsKnown(null, null); |
| 143 return; | 140 return; |
| 144 } | 141 } |
| 145 | 142 |
| 146 Bundle freProperties = new Bundle(); | 143 final Account[] googleAccounts = getGoogleAccounts(); |
| 147 freProperties.putAll(mLaunchProperties); | 144 final boolean onlyOneAccount = googleAccounts.length == 1; |
| 148 freProperties.remove(FirstRunActivity.EXTRA_USE_FRE_FLOW_SEQUENCER); | |
| 149 | |
| 150 Account[] googleAccounts = getGoogleAccounts(); | |
| 151 boolean onlyOneAccount = googleAccounts.length == 1; | |
| 152 | 145 |
| 153 // EDU devices should always have exactly 1 google account, which will b e automatically | 146 // EDU devices should always have exactly 1 google account, which will b e automatically |
| 154 // signed-in. All FRE screens are skipped in this case. | 147 // signed-in. All FRE screens are skipped in this case. |
| 155 boolean forceEduSignIn = androidEduDevice && onlyOneAccount && !isSigned In(); | 148 final boolean forceEduSignIn = androidEduDevice && onlyOneAccount && !is SignedIn(); |
| 149 | |
| 150 boolean useFlowSequencer = | |
| 151 mLaunchProperties.getBoolean(FirstRunActivity.EXTRA_USE_FRE_FLOW _SEQUENCER); | |
| 152 // Note: freProperties is bound to the Runnable below. | |
| 153 final Bundle freProperties = useFlowSequencer ? new Bundle() : mLaunchPr operties; | |
| 154 | |
| 155 Runnable setUpPropertiesPostNative = new Runnable() { | |
|
Ted C
2016/12/01 21:59:06
instead of passing a Runnable, I think this should
Alexei Svitkine (slow)
2016/12/02 18:34:54
Done. Compared to the previous approach, this requ
| |
| 156 @Override | |
| 157 public void run() { | |
| 158 // We show the sign-in page if sync is allowed, and not signed i n, and this is not | |
|
Ted C
2016/12/01 21:59:06
should this remove POST_NATIVE_SETUP_NEEDED?
Alexei Svitkine (slow)
2016/12/02 18:34:54
Done.
| |
| 159 // an EDU device, and | |
| 160 // - no "skip the first use hints" is set, or | |
| 161 // - "skip the first use hints" is set, but there is at least on e account. | |
| 162 boolean offerSignInOk = isSyncAllowed() && !isSignedIn() && !for ceEduSignIn | |
| 163 && (!shouldSkipFirstUseHints() || googleAccounts.length > 0); | |
| 164 freProperties.putBoolean(FirstRunActivity.SHOW_SIGNIN_PAGE, offe rSignInOk); | |
| 165 if (offerSignInOk || forceEduSignIn) { | |
| 166 // If the user has accepted the ToS in the Setup Wizard and there is exactly | |
| 167 // one account, or if the device has a child account, or if the device is an | |
| 168 // Android EDU device and there is exactly one account, pres elect the sign-in | |
| 169 // account and force the selection if necessary. | |
| 170 if ((hasAnyUserSeenToS() && onlyOneAccount) || hasChildAccou nt | |
| 171 || forceEduSignIn) { | |
| 172 freProperties.putString(AccountFirstRunFragment.FORCE_SI GNIN_ACCOUNT_TO, | |
| 173 googleAccounts[0].name); | |
| 174 freProperties.putBoolean( | |
| 175 AccountFirstRunFragment.PRESELECT_BUT_ALLOW_TO_C HANGE, | |
| 176 !forceEduSignIn && !hasChildAccount); | |
| 177 } | |
| 178 } | |
| 179 | |
| 180 freProperties.putBoolean( | |
| 181 FirstRunActivity.SHOW_DATA_REDUCTION_PAGE, shouldShowDat aReductionPage()); | |
| 182 } | |
| 183 }; | |
| 184 | |
| 185 if (!useFlowSequencer) { | |
| 186 // If EXTRA_USE_FRE_FLOW_SEQUENCER is not set, it means we should us e the properties as | |
| 187 // provided instead of setting them up. However, the properties as p rovided may not yet | |
| 188 // have post-native properties computed, so the Runnable still needs to be passed. | |
| 189 onFlowIsKnown(mLaunchProperties, setUpPropertiesPostNative); | |
| 190 return; | |
| 191 } | |
| 192 | |
| 193 freProperties.putAll(mLaunchProperties); | |
| 194 freProperties.remove(FirstRunActivity.EXTRA_USE_FRE_FLOW_SEQUENCER); | |
| 156 | 195 |
| 157 // In the full FRE we always show the Welcome page, except on EDU device s. | 196 // In the full FRE we always show the Welcome page, except on EDU device s. |
| 158 boolean showWelcomePage = !forceEduSignIn; | 197 boolean showWelcomePage = !forceEduSignIn; |
| 159 freProperties.putBoolean(FirstRunActivity.SHOW_WELCOME_PAGE, showWelcome Page); | 198 freProperties.putBoolean(FirstRunActivity.SHOW_WELCOME_PAGE, showWelcome Page); |
| 199 freProperties.putBoolean(AccountFirstRunFragment.IS_CHILD_ACCOUNT, hasCh ildAccount); | |
| 200 | |
| 201 // Set a boolean to indicate we need to do post native setup via the run nable below. | |
| 202 freProperties.putBoolean(FirstRunActivity.POST_NATIVE_SETUP_NEEDED, true ); | |
| 160 | 203 |
| 161 // Initialize usage and crash reporting according to the default value. | 204 // Initialize usage and crash reporting according to the default value. |
| 162 // The user can explicitly enable or disable the reporting on the Welcom e page. | 205 // The user can explicitly enable or disable the reporting on the Welcom e page. |
| 163 // This is controlled by the administrator via a policy on EDU devices. | 206 // This is controlled by the administrator via a policy on EDU devices. |
| 164 setDefaultMetricsAndCrashReporting(); | 207 setDefaultMetricsAndCrashReporting(); |
| 165 | 208 |
| 166 // We show the sign-in page if sync is allowed, and not signed in, and t his is not an EDU | 209 onFlowIsKnown(freProperties, setUpPropertiesPostNative); |
| 167 // device, and | |
| 168 // - no "skip the first use hints" is set, or | |
| 169 // - "skip the first use hints" is set, but there is at least one accoun t. | |
| 170 final boolean offerSignInOk = isSyncAllowed() | |
| 171 && !isSignedIn() | |
| 172 && !forceEduSignIn | |
| 173 && (!shouldSkipFirstUseHints() || googleAccounts.length > 0); | |
| 174 freProperties.putBoolean(FirstRunActivity.SHOW_SIGNIN_PAGE, offerSignInO k); | |
| 175 | |
| 176 if (offerSignInOk || forceEduSignIn) { | |
| 177 // If the user has accepted the ToS in the Setup Wizard and there is exactly | |
| 178 // one account, or if the device has a child account, or if the devi ce is an | |
| 179 // Android EDU device and there is exactly one account, preselect th e sign-in | |
| 180 // account and force the selection if necessary. | |
| 181 if ((hasAnyUserSeenToS() && onlyOneAccount) || hasChildAccount || fo rceEduSignIn) { | |
| 182 freProperties.putString(AccountFirstRunFragment.FORCE_SIGNIN_ACC OUNT_TO, | |
| 183 googleAccounts[0].name); | |
| 184 freProperties.putBoolean(AccountFirstRunFragment.PRESELECT_BUT_A LLOW_TO_CHANGE, | |
| 185 !forceEduSignIn && !hasChildAccount); | |
| 186 } | |
| 187 } | |
| 188 | |
| 189 freProperties.putBoolean(AccountFirstRunFragment.IS_CHILD_ACCOUNT, hasCh ildAccount); | |
| 190 | |
| 191 freProperties.putBoolean(FirstRunActivity.SHOW_DATA_REDUCTION_PAGE, | |
| 192 shouldShowDataReductionPage()); | |
| 193 | |
| 194 onFlowIsKnown(freProperties); | |
| 195 if (hasChildAccount || forceEduSignIn) { | 210 if (hasChildAccount || forceEduSignIn) { |
| 196 // Child and Edu forced signins are processed independently. | 211 // Child and Edu forced signins are processed independently. |
| 197 setFirstRunFlowSignInComplete(); | 212 setFirstRunFlowSignInComplete(); |
| 198 } | 213 } |
| 199 } | 214 } |
| 200 | 215 |
| 201 /** | 216 /** |
| 202 * Marks a given flow as completed. | 217 * Marks a given flow as completed. |
| 203 * @param activity An activity. | 218 * @param activity An activity. |
| 204 * @param data Resulting FRE properties bundle. | 219 * @param data Resulting FRE properties bundle. |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 288 * @param fromIntent The intent that was used to launch Chrome. | 303 * @param fromIntent The intent that was used to launch Chrome. |
| 289 */ | 304 */ |
| 290 public static void addPendingIntent(Context context, Intent firstRunIntent, Intent fromIntent) { | 305 public static void addPendingIntent(Context context, Intent firstRunIntent, Intent fromIntent) { |
| 291 PendingIntent pendingIntent = PendingIntent.getActivity(context, | 306 PendingIntent pendingIntent = PendingIntent.getActivity(context, |
| 292 FIRST_RUN_EXPERIENCE_REQUEST_CODE, | 307 FIRST_RUN_EXPERIENCE_REQUEST_CODE, |
| 293 fromIntent, | 308 fromIntent, |
| 294 fromIntent.getFlags()); | 309 fromIntent.getFlags()); |
| 295 firstRunIntent.putExtra(FirstRunActivity.EXTRA_CHROME_LAUNCH_INTENT, pen dingIntent); | 310 firstRunIntent.putExtra(FirstRunActivity.EXTRA_CHROME_LAUNCH_INTENT, pen dingIntent); |
| 296 } | 311 } |
| 297 } | 312 } |
| OLD | NEW |