#include "components/sync/driver/sync_service_utils.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "components/sync/base/passphrase_enums.h"
#include "components/sync/driver/sync_service.h"
#include "components/sync/driver/sync_user_settings.h"
#include "google_apis/gaia/google_service_auth_error.h"
namespace syncer {
UploadState GetUploadToGoogleState(const SyncService* sync_service,
ModelType type) {
if (!sync_service || sync_service->IsLocalSyncEnabled() ||
!sync_service->CanSyncFeatureStart() ||
!sync_service->GetPreferredDataTypes().Has(type)) {
return UploadState::NOT_ACTIVE;
}
if (sync_service->GetUserSettings()->GetEncryptedDataTypes().Has(type) &&
sync_service->GetUserSettings()->IsUsingExplicitPassphrase()) {
return UploadState::NOT_ACTIVE;
}
if (sync_service->GetAuthError().IsPersistentError()) {
DCHECK_EQ(sync_service->GetTransportState(),
SyncService::TransportState::PAUSED);
}
DCHECK(!sync_service->GetAuthError().IsTransientError());
switch (sync_service->GetTransportState()) {
case SyncService::TransportState::DISABLED:
case SyncService::TransportState::PAUSED:
return UploadState::NOT_ACTIVE;
case SyncService::TransportState::START_DEFERRED:
case SyncService::TransportState::INITIALIZING:
case SyncService::TransportState::PENDING_DESIRED_CONFIGURATION:
case SyncService::TransportState::CONFIGURING:
return UploadState::INITIALIZING;
case SyncService::TransportState::ACTIVE:
if (!sync_service->GetActiveDataTypes().Has(type)) {
return UploadState::NOT_ACTIVE;
}
if (!sync_service->HasCompletedSyncCycle()) {
return UploadState::INITIALIZING;
}
return UploadState::ACTIVE;
}
NOTREACHED();
return UploadState::NOT_ACTIVE;
}
void RecordKeyRetrievalTrigger(TrustedVaultUserActionTriggerForUMA trigger) {
base::UmaHistogramEnumeration("Sync.TrustedVaultKeyRetrievalTrigger",
trigger);
}
void RecordRecoverabilityDegradedFixTrigger(
TrustedVaultUserActionTriggerForUMA trigger) {
base::UmaHistogramEnumeration(
"Sync.TrustedVaultRecoverabilityDegradedFixTrigger", trigger);
}
bool ShouldOfferTrustedVaultOptIn(const SyncService* service) {
if (!service) {
return false;
}
if (service->GetTransportState() != SyncService::TransportState::ACTIVE) {
return false;
}
const ModelTypeSet encrypted_types =
service->GetUserSettings()->GetEncryptedDataTypes();
if (Intersection(service->GetActiveDataTypes(), encrypted_types).Empty()) {
return false;
}
switch (service->GetUserSettings()->GetPassphraseType()) {
case PassphraseType::kImplicitPassphrase:
case PassphraseType::kFrozenImplicitPassphrase:
case PassphraseType::kCustomPassphrase:
case PassphraseType::kTrustedVaultPassphrase:
return false;
case PassphraseType::kKeystorePassphrase:
return !service->GetUserSettings()->IsPassphraseRequired();
}
}
}