Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(684)

Side by Side Diff: chrome/browser/chromeos/arc/arc_session_manager.cc

Issue 2785813002: arc: Provide UMA for OptIn flow. (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 #include "chrome/browser/chromeos/arc/arc_session_manager.h" 5 #include "chrome/browser/chromeos/arc/arc_session_manager.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "ash/common/shelf/shelf_delegate.h" 9 #include "ash/common/shelf/shelf_delegate.h"
10 #include "ash/common/wm_shell.h" 10 #include "ash/common/wm_shell.h"
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 // We don't expect ProvisioningResult::SUCCESS is reported twice or reported 204 // We don't expect ProvisioningResult::SUCCESS is reported twice or reported
205 // after an error. 205 // after an error.
206 DCHECK_NE(result, ProvisioningResult::SUCCESS); 206 DCHECK_NE(result, ProvisioningResult::SUCCESS);
207 // TODO(khmel): Consider changing LOG to NOTREACHED once we guaranty that 207 // TODO(khmel): Consider changing LOG to NOTREACHED once we guaranty that
208 // no double message can happen in production. 208 // no double message can happen in production.
209 LOG(WARNING) << "Provisioning result was already reported. Ignoring " 209 LOG(WARNING) << "Provisioning result was already reported. Ignoring "
210 << "additional result " << static_cast<int>(result) << "."; 210 << "additional result " << static_cast<int>(result) << ".";
211 return; 211 return;
212 } 212 }
213 provisioning_reported_ = true; 213 provisioning_reported_ = true;
214 optin_flow_error_detected_ |= (result != ProvisioningResult::SUCCESS);
214 215
215 if (result == ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR) { 216 if (result == ProvisioningResult::CHROME_SERVER_COMMUNICATION_ERROR) {
216 if (IsArcKioskMode()) { 217 if (IsArcKioskMode()) {
217 VLOG(1) << "Robot account auth code fetching error"; 218 VLOG(1) << "Robot account auth code fetching error";
218 // Log out the user. All the cleanup will be done in Shutdown() method. 219 // Log out the user. All the cleanup will be done in Shutdown() method.
219 // The callback is not called because auth code is empty. 220 // The callback is not called because auth code is empty.
220 attempt_user_exit_callback_.Run(); 221 attempt_user_exit_callback_.Run();
221 return; 222 return;
222 } 223 }
223 224
224 // For backwards compatibility, use NETWORK_ERROR for 225 // For backwards compatibility, use NETWORK_ERROR for
225 // CHROME_SERVER_COMMUNICATION_ERROR case. 226 // CHROME_SERVER_COMMUNICATION_ERROR case.
226 UpdateOptInCancelUMA(OptInCancelReason::NETWORK_ERROR); 227 UpdateOptInCancelUMA(OptInCancelReason::NETWORK_ERROR);
227 } else if (!sign_in_start_time_.is_null()) { 228 } else if (!sign_in_start_time_.is_null()) {
228 arc_sign_in_timer_.Stop(); 229 arc_sign_in_timer_.Stop();
229 230
230 UpdateProvisioningTiming(base::Time::Now() - sign_in_start_time_, 231 UpdateProvisioningTiming(base::Time::Now() - sign_in_start_time_,
231 result == ProvisioningResult::SUCCESS, 232 result == ProvisioningResult::SUCCESS,
232 policy_util::IsAccountManaged(profile_)); 233 policy_util::IsAccountManaged(profile_));
233 UpdateProvisioningResultUMA(result, 234 UpdateProvisioningResultUMA(result,
234 policy_util::IsAccountManaged(profile_)); 235 policy_util::IsAccountManaged(profile_));
235 if (result != ProvisioningResult::SUCCESS) 236 if (result != ProvisioningResult::SUCCESS)
236 UpdateOptInCancelUMA(OptInCancelReason::CLOUD_PROVISION_FLOW_FAIL); 237 UpdateOptInCancelUMA(OptInCancelReason::CLOUD_PROVISION_FLOW_FAIL);
237 } 238 }
238 239
239 if (result == ProvisioningResult::SUCCESS) { 240 if (result == ProvisioningResult::SUCCESS) {
240 if (support_host_) 241 if (support_host_)
241 support_host_->Close(); 242 support_host_->Close();
242 243
244 StopOptInFlowTracking(true);
245
243 if (profile_->GetPrefs()->GetBoolean(prefs::kArcSignedIn)) 246 if (profile_->GetPrefs()->GetBoolean(prefs::kArcSignedIn))
244 return; 247 return;
245 248
246 profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, true); 249 profile_->GetPrefs()->SetBoolean(prefs::kArcSignedIn, true);
247 250
248 // Launch Play Store app, except for the following cases: 251 // Launch Play Store app, except for the following cases:
249 // * When Opt-in verification is disabled (for tests); 252 // * When Opt-in verification is disabled (for tests);
250 // * In ARC Kiosk mode, because the only one UI in kiosk mode must be the 253 // * In ARC Kiosk mode, because the only one UI in kiosk mode must be the
251 // kiosk app and device is not needed for opt-in; 254 // kiosk app and device is not needed for opt-in;
252 // * When ARC is managed and all OptIn preferences are managed too, because 255 // * When ARC is managed and all OptIn preferences are managed too, because
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 544
542 void ArcSessionManager::RequestDisable() { 545 void ArcSessionManager::RequestDisable() {
543 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 546 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
544 DCHECK(profile_); 547 DCHECK(profile_);
545 548
546 if (!enable_requested_) { 549 if (!enable_requested_) {
547 VLOG(1) << "ARC is already disabled. Do nothing."; 550 VLOG(1) << "ARC is already disabled. Do nothing.";
548 return; 551 return;
549 } 552 }
550 enable_requested_ = false; 553 enable_requested_ = false;
554 StopOptInFlowTracking(false);
551 555
552 // Reset any pending request to re-enable ARC. 556 // Reset any pending request to re-enable ARC.
553 reenable_arc_ = false; 557 reenable_arc_ = false;
554 StopArc(); 558 StopArc();
555 VLOG(1) << "ARC opt-out. Removing user data."; 559 VLOG(1) << "ARC opt-out. Removing user data.";
556 RequestArcDataRemoval(); 560 RequestArcDataRemoval();
557 } 561 }
558 562
559 void ArcSessionManager::RequestArcDataRemoval() { 563 void ArcSessionManager::RequestArcDataRemoval() {
560 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 564 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 599
596 // TODO(hidehiko): Remove this condition, when the state machine is fixed. 600 // TODO(hidehiko): Remove this condition, when the state machine is fixed.
597 if (!arc_session_runner_->IsStopped()) { 601 if (!arc_session_runner_->IsStopped()) {
598 // If the user attempts to re-enable ARC while the ARC instance is still 602 // If the user attempts to re-enable ARC while the ARC instance is still
599 // running the user should not be able to continue until the ARC instance 603 // running the user should not be able to continue until the ARC instance
600 // has stopped. 604 // has stopped.
601 if (support_host_) { 605 if (support_host_) {
602 support_host_->ShowError( 606 support_host_->ShowError(
603 ArcSupportHost::Error::SIGN_IN_SERVICE_UNAVAILABLE_ERROR, false); 607 ArcSupportHost::Error::SIGN_IN_SERVICE_UNAVAILABLE_ERROR, false);
604 } 608 }
609 UpdateOptInCancelUMA(OptInCancelReason::SESSION_BUSY);
khmel 2017/03/29 21:41:09 We never recorded this issue. It would be nice to
605 return; 610 return;
606 } 611 }
607 612
608 // TODO(hidehiko): DCHECK if |state_| is STOPPED, when the state machine 613 // TODO(hidehiko): DCHECK if |state_| is STOPPED, when the state machine
609 // is fixed. 614 // is fixed.
610 SetState(State::NEGOTIATING_TERMS_OF_SERVICE); 615 SetState(State::NEGOTIATING_TERMS_OF_SERVICE);
611 616
617 StartOptInFlowTracking();
618
612 if (!IsArcTermsOfServiceNegotiationNeeded()) { 619 if (!IsArcTermsOfServiceNegotiationNeeded()) {
613 // Moves to next state, Android management check, immediately, as if 620 // Moves to next state, Android management check, immediately, as if
614 // Terms of Service negotiation is done successfully. 621 // Terms of Service negotiation is done successfully.
615 StartAndroidManagementCheck(); 622 StartAndroidManagementCheck();
616 return; 623 return;
617 } 624 }
618 625
619 if (IsOobeOptInActive()) { 626 if (IsOobeOptInActive()) {
620 VLOG(1) << "Use OOBE negotiator."; 627 VLOG(1) << "Use OOBE negotiator.";
621 terms_of_service_negotiator_ = 628 terms_of_service_negotiator_ =
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
949 arc_session_runner_ = std::move(arc_session_runner); 956 arc_session_runner_ = std::move(arc_session_runner);
950 arc_session_runner_->AddObserver(this); 957 arc_session_runner_->AddObserver(this);
951 } 958 }
952 959
953 void ArcSessionManager::SetAttemptUserExitCallbackForTesting( 960 void ArcSessionManager::SetAttemptUserExitCallbackForTesting(
954 const base::Closure& callback) { 961 const base::Closure& callback) {
955 DCHECK(!callback.is_null()); 962 DCHECK(!callback.is_null());
956 attempt_user_exit_callback_ = callback; 963 attempt_user_exit_callback_ = callback;
957 } 964 }
958 965
966 void ArcSessionManager::StartOptInFlowTracking() {
967 // Test if we already started OptIn flow tracking.
968 if (optin_flow_tracked_)
969 return;
970
971 if (profile_->GetPrefs()->GetBoolean(prefs::kArcSignedIn)) {
972 VLOG(1) << "Skip tracking opt-in flow for already signed ARC";
973 return;
974 }
975
976 UpdateOptInFlowResultUMA(OptInFlowResult::STARTED);
977 optin_flow_tracked_ = true;
978 optin_flow_error_detected_ = false;
979 }
980
981 void ArcSessionManager::StopOptInFlowTracking(bool succeeded) {
982 if (!optin_flow_tracked_)
983 return;
984
985 UpdateOptInFlowResultUMA(succeeded ? OptInFlowResult::SUCCEEDED
986 : OptInFlowResult::CANCELED);
987 if (optin_flow_error_detected_) {
988 UpdateOptInFlowResultUMA(succeeded ? OptInFlowResult::SUCCEEDED_AFTER_RETRY
989 : OptInFlowResult::CANCELED_AFTER_ERROR);
990 }
991
992 optin_flow_tracked_ = false;
993 }
994
959 std::ostream& operator<<(std::ostream& os, 995 std::ostream& operator<<(std::ostream& os,
960 const ArcSessionManager::State& state) { 996 const ArcSessionManager::State& state) {
961 #define MAP_STATE(name) \ 997 #define MAP_STATE(name) \
962 case ArcSessionManager::State::name: \ 998 case ArcSessionManager::State::name: \
963 return os << #name 999 return os << #name
964 1000
965 switch (state) { 1001 switch (state) {
966 MAP_STATE(NOT_INITIALIZED); 1002 MAP_STATE(NOT_INITIALIZED);
967 MAP_STATE(STOPPED); 1003 MAP_STATE(STOPPED);
968 MAP_STATE(NEGOTIATING_TERMS_OF_SERVICE); 1004 MAP_STATE(NEGOTIATING_TERMS_OF_SERVICE);
969 MAP_STATE(CHECKING_ANDROID_MANAGEMENT); 1005 MAP_STATE(CHECKING_ANDROID_MANAGEMENT);
970 MAP_STATE(REMOVING_DATA_DIR); 1006 MAP_STATE(REMOVING_DATA_DIR);
971 MAP_STATE(ACTIVE); 1007 MAP_STATE(ACTIVE);
972 } 1008 }
973 1009
974 #undef MAP_STATE 1010 #undef MAP_STATE
975 1011
976 // Some compilers report an error even if all values of an enum-class are 1012 // Some compilers report an error even if all values of an enum-class are
977 // covered exhaustively in a switch statement. 1013 // covered exhaustively in a switch statement.
978 NOTREACHED() << "Invalid value " << static_cast<int>(state); 1014 NOTREACHED() << "Invalid value " << static_cast<int>(state);
979 return os; 1015 return os;
980 } 1016 }
981 1017
982 } // namespace arc 1018 } // namespace arc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698