[go: nahoru, domu]

blob: f5dda8c9bd879ea223503780a9977602b118163b [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ASH_ARC_ARC_OPTIN_UMA_H_
#define CHROME_BROWSER_ASH_ARC_ARC_OPTIN_UMA_H_
#include <ostream>
#include "ash/components/arc/mojom/app.mojom-forward.h"
#include "ash/components/arc/mojom/auth.mojom-forward.h"
class Profile;
namespace base {
class TimeDelta;
}
namespace arc {
class ArcProvisioningResult;
// These enums are used to define the buckets for an enumerated UMA histogram
// and need to be synced with tools/metrics/histograms/enums.xml. Note that
// values 0, 1, 2, 3 and 4 are now deprecated.
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class OptInActionType : int {
// User asked to retry OptIn.
RETRY = 5,
// ARC was opted in by user from OOBE flow.
OOBE_OPTED_IN = 6,
// ARC was opted out by user from OOBE flow.
OOBE_OPTED_OUT = 7,
// ARC was opted in by user from session.
SESSION_OPTED_IN = 8,
// ARC was opted out by user from session.
SESSION_OPTED_OUT = 9,
// ARC was opted in due to configuration in OOBE flow.
OOBE_OPTED_IN_CONFIGURATION = 10,
kMaxValue = OOBE_OPTED_IN_CONFIGURATION,
};
enum class OptInCancelReason {
// Canceled by user.
USER_CANCEL = 0,
// Unclassified failure.
UNKNOWN_ERROR = 1,
// Network failure.
NETWORK_ERROR = 2,
DEPRECATED_SERVICE_UNAVAILABLE = 3,
DEPRECATED_BAD_AUTHENTICATION = 4,
DEPRECATED_GMS_CORE_NOT_AVAILABLE = 5,
// Provision failed.
PROVISIONING_FAILED = 6,
// Android management is required for user.
ANDROID_MANAGEMENT_REQUIRED = 7,
// Cannot start ARC because it is busy.
SESSION_BUSY = 8,
kMaxValue = SESSION_BUSY,
};
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class OptInNetworkErrorActionType {
// User closed the optin dialog.
WINDOW_CLOSED = 0,
// User asked to retry optin.
RETRY = 1,
// User asked to send feedback.
SEND_FEEDBACK = 2,
// User wants to diagnose network.
CHECK_NETWORK = 3,
// Network error page was shown. This bucket encompasses all others and works
// as a total count for network-related errors (instead of the histogram's
// total sample count which doesn't reflect that information). This enum
// value was added on 2023 Dec 21. The data before this date is missing.
ERROR_SHOWN = 4,
kMaxValue = ERROR_SHOWN,
};
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class OptInSilentAuthCode {
// Silent auth code feature is disabled.
DISABLED = 0,
// Silent auth code fetched normally.
SUCCESS = 1,
// HTTP Context cannot be prepared.
CONTEXT_NOT_READY = 2,
// No LST token is available.
NO_LST_TOKEN = 3,
// Silent auth code failed due sever HTTP error 5XX.
HTTP_SERVER_FAILURE = 4,
// Silent auth code failed due client HTTP error 4XX.
HTTP_CLIENT_FAILURE = 5,
// Silent auth code failed due unknown HTTP error.
HTTP_UNKNOWN_FAILURE = 6,
// Cannot parse HTTP response.
RESPONSE_PARSE_FAILURE = 7,
// No Auth code in response.
NO_AUTH_CODE_IN_RESPONSE = 8,
// The network was configured with a mandatory PAC script that could not be
// fetched, parsed or executed.
MANDATORY_PROXY_CONFIGURATION_FAILED = 9,
kMaxValue = MANDATORY_PROXY_CONFIGURATION_FAILED,
};
// The values should be listed in ascending order. They are also persisted to
// logs, and their values should therefore never be renumbered nor reused.
enum class ProvisioningStatus {
// Provisioning was successful.
SUCCESS = 0,
// Unclassified failure.
UNKNOWN_ERROR = 1,
// Unmanaged sign-in error.
GMS_SIGN_IN_ERROR = 2,
// Check in error.
GMS_CHECK_IN_ERROR = 3,
// Managed sign-in error.
CLOUD_PROVISION_FLOW_ERROR = 4,
// Mojo errors.
MOJO_VERSION_MISMATCH = 5,
// ARC did not finish provisioning within a reasonable amount of time.
GENERIC_PROVISIONING_TIMEOUT = 6,
// ARC instance did not report provisioning status within a reasonable amount
// of time.
CHROME_PROVISIONING_TIMEOUT = 7,
// ARC instance is stopped during the sign in procedure.
ARC_STOPPED = 8,
// ARC is not enabled.
ARC_DISABLED = 9,
// In Chrome, server communication error occurs.
// For backward compatibility, the UMA is handled differently. Please see
// ArcSessionManager::OnProvisioningFinished for details.
CHROME_SERVER_COMMUNICATION_ERROR = 10,
// Network connection is unavailable in ARC.
NO_NETWORK_CONNECTION = 11,
// Account type is not supported for authorization.
UNSUPPORTED_ACCOUNT_TYPE = 12,
// Account is not present in Chrome OS Account Manager.
CHROME_ACCOUNT_NOT_FOUND = 13,
kMaxValue = CHROME_ACCOUNT_NOT_FOUND,
};
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class OptInFlowResult : int {
// OptIn has started.
STARTED = 0,
// OptIn has been succeeded, this also includes succeeded with error cases.
SUCCEEDED = 1,
// OptIn has been succeeded but with retry after an error.
SUCCEEDED_AFTER_RETRY = 2,
// OptIn has been canceled, this also includes canceled after error cases.
CANCELED = 3,
// OptIn has been canceled after an error was reported.
CANCELED_AFTER_ERROR = 4,
kMaxValue = CANCELED_AFTER_ERROR,
};
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class ArcProvisioningCheckinResult {
kSuccess = 0,
kUnknownError = 1,
kTimeout = 2,
kMaxValue = kTimeout,
};
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class ArcProvisioningDpcResult {
kSuccess = 0,
kUnknownError = 1,
kInvalidToken = 2,
kAccountAddFail = 3,
kTimeout = 4,
kNetworkError = 5,
kOAuthAuthException = 6,
kOAuthIOException = 7,
kMaxValue = kOAuthIOException,
};
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class ArcProvisioningSigninResult {
kSuccess = 0,
kUnknownError = 1,
kNetworkError = 2,
kServiceUnavailable = 3,
kAuthFailure = 4,
kTimeout = 5,
kMaxValue = kTimeout,
};
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class ArcEnabledState {
// ARC++ is enabled for non-managed case.
ENABLED_NOT_MANAGED = 0,
// ARC++ is disabled for non-managed case.
DISABLED_NOT_MANAGED = 1,
// ARC++ is enabled for managed case when ARC++ is forced on.
ENABLED_MANAGED_ON = 2,
// ARC++ is disabled for managed case when ARC++ is forced on. This can happen
// when user declines ToS even if ARC++ is forced on.
DISABLED_MANAGED_ON = 3,
// ARC++ is disabled for managed case when ARC++ is forced off.
DISABLED_MANAGED_OFF = 4,
// ARC++ is enabled in case ARC++ is not allowed for the device. This can
// happen for ARC++ kiosk mode.
ENABLED_NOT_ALLOWED = 5,
// ARC++ is disabled and ARC++ is not allowed for the device.
DISABLED_NOT_ALLOWED = 6,
kMaxValue = DISABLED_NOT_ALLOWED,
};
// Called from the Chrome OS metrics provider to record Arc.StateByUserType
// strictly once per every metrics recording interval. This way they are in
// every record uploaded to the server and therefore can be used to split and
// compare analysis data for all other metrics.
// TODO(shaochuan): Decouple profile-related logic and move recording to
// components/arc.
void UpdateEnabledStateByUserTypeUMA();
void UpdateOptInActionUMA(OptInActionType type);
void UpdateOptInCancelUMA(OptInCancelReason reason);
void UpdateOptInFlowResultUMA(OptInFlowResult result);
void UpdateOptInNetworkErrorActionUMA(OptInNetworkErrorActionType type);
void UpdateProvisioningStatusUMA(ProvisioningStatus status,
const Profile* profile);
void UpdateProvisioningDpcResultUMA(ArcProvisioningDpcResult result,
const Profile* profile);
void UpdateProvisioningSigninResultUMA(ArcProvisioningSigninResult result,
const Profile* profile);
void UpdateProvisioningCheckinResultUMA(ArcProvisioningCheckinResult result,
const Profile* profile);
void UpdateSecondarySigninResultUMA(ProvisioningStatus status);
void UpdateProvisioningTiming(const base::TimeDelta& elapsed_time,
bool success,
const Profile* profile);
void UpdateReauthorizationResultUMA(ProvisioningStatus status,
const Profile* profile);
void UpdatePlayAutoInstallRequestState(mojom::PaiFlowState state,
const Profile* profile);
void UpdatePlayAutoInstallRequestTime(const base::TimeDelta& elapsed_time,
const Profile* profile);
void UpdateArcUiAvailableTime(const base::TimeDelta& elapsed_time,
const std::string& mode,
const Profile* profile);
void UpdatePlayStoreLaunchTime(const base::TimeDelta& elapsed_time);
void UpdateDeferredLaunchTime(const base::TimeDelta& elapsed_time);
void UpdateOptinTosLoadResultUMA(bool success);
void UpdateSilentAuthCodeUMA(OptInSilentAuthCode state);
void UpdateSupervisionTransitionResultUMA(mojom::ManagementChangeStatus result);
void UpdateReauthorizationSilentAuthCodeUMA(OptInSilentAuthCode state);
void UpdateSecondaryAccountSilentAuthCodeUMA(OptInSilentAuthCode state);
void UpdateAuthTiming(const char* histogram_name,
base::TimeDelta elapsed_time,
const Profile* profile);
void UpdateAuthCheckinAttempts(int32_t num_attempts, const Profile* profile);
void UpdateAuthAccountCheckStatus(mojom::AccountCheckStatus status,
const Profile* profile);
void UpdateAccountReauthReason(mojom::ReauthReason reason,
const Profile* profile);
void UpdateMainAccountResolutionStatus(
const Profile* profile,
mojom::MainAccountResolutionStatus status);
// Returns the enum for use in UMA stat for reporting DPC errors.
ArcProvisioningDpcResult GetDpcErrorResult(
mojom::CloudProvisionFlowError error);
// Returns the enum for use in UMA stat for reporting signin errors.
ArcProvisioningSigninResult GetSigninErrorResult(mojom::GMSSignInError error);
// Returns the enum for use in UMA stat for reporting checkin errors.
ArcProvisioningCheckinResult GetCheckinErrorResult(
mojom::GMSCheckInError error);
// Returns the enum for use in UMA stat and displaying error code on the UI.
// This enum should not be used anywhere else. Please work with the object
// instead.
ProvisioningStatus GetProvisioningStatus(
const ArcProvisioningResult& provisioning_result);
// Outputs the stringified |result| to |os|. This is only for logging purposes.
std::ostream& operator<<(std::ostream& os, const ProvisioningStatus& status);
} // namespace arc
#endif // CHROME_BROWSER_ASH_ARC_ARC_OPTIN_UMA_H_