| Index: ios/chrome/browser/ui/sync/sync_util.mm
|
| diff --git a/ios/chrome/browser/ui/sync/sync_util.mm b/ios/chrome/browser/ui/sync/sync_util.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0e82b79649ca0b0dd2c47411d267fb8556541e89
|
| --- /dev/null
|
| +++ b/ios/chrome/browser/ui/sync/sync_util.mm
|
| @@ -0,0 +1,182 @@
|
| +// Copyright 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#import "ios/chrome/browser/ui/sync/sync_util.h"
|
| +
|
| +#include "base/metrics/histogram.h"
|
| +#include "components/infobars/core/infobar_manager.h"
|
| +#include "components/strings/grit/components_strings.h"
|
| +#import "ios/chrome/browser/browser_state/chrome_browser_state.h"
|
| +#include "ios/chrome/browser/sync/sync_setup_service.h"
|
| +#include "ios/chrome/browser/sync/sync_setup_service_factory.h"
|
| +#import "ios/chrome/browser/tabs/tab.h"
|
| +#import "ios/chrome/browser/ui/commands/generic_chrome_command.h"
|
| +#include "ios/chrome/browser/ui/commands/ios_command_ids.h"
|
| +#import "ios/chrome/browser/ui/commands/show_signin_command.h"
|
| +#include "ios/chrome/browser/ui/sync/sync_error_infobar_delegate.h"
|
| +#include "ios/chrome/grit/ios_chromium_strings.h"
|
| +#include "ios/chrome/grit/ios_strings.h"
|
| +#include "ui/base/l10n/l10n_util.h"
|
| +
|
| +namespace {
|
| +// Enumerated constants for logging when a sign-in error infobar was shown
|
| +// to the user. This was added for crbug/265352 to quantify how often this
|
| +// bug shows up in the wild. The logged histogram count should be interpreted
|
| +// as a ratio of the number of active sync users.
|
| +enum {
|
| + SYNC_SIGN_IN_NEEDS_UPDATE = 1,
|
| + SYNC_SERVICE_UNAVAILABLE,
|
| + SYNC_NEEDS_PASSPHRASE,
|
| + SYNC_UNRECOVERABLE_ERROR,
|
| + SYNC_ERROR_COUNT
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +namespace ios_internal {
|
| +namespace sync {
|
| +
|
| +NSString* GetSyncErrorDescriptionForBrowserState(
|
| + ios::ChromeBrowserState* browserState) {
|
| + SyncSetupService* syncSetupService =
|
| + SyncSetupServiceFactory::GetForBrowserState(browserState);
|
| + DCHECK(syncSetupService);
|
| + SyncSetupService::SyncServiceState syncState =
|
| + syncSetupService->GetSyncServiceState();
|
| + switch (syncState) {
|
| + case SyncSetupService::kNoSyncServiceError:
|
| + return nil;
|
| + case SyncSetupService::kSyncServiceSignInNeedsUpdate:
|
| + return l10n_util::GetNSString(IDS_IOS_SYNC_LOGIN_INFO_OUT_OF_DATE);
|
| + case SyncSetupService::kSyncServiceNeedsPassphrase:
|
| + return l10n_util::GetNSString(IDS_IOS_SYNC_ENCRYPTION_DESCRIPTION);
|
| + case SyncSetupService::kSyncServiceServiceUnavailable:
|
| + case SyncSetupService::kSyncServiceCouldNotConnect:
|
| + case SyncSetupService::kSyncServiceUnrecoverableError:
|
| + return l10n_util::GetNSString(IDS_IOS_SYNC_STATUS_UNRECOVERABLE_ERROR);
|
| + }
|
| +}
|
| +
|
| +NSString* GetSyncErrorMessageForBrowserState(
|
| + ios::ChromeBrowserState* browserState) {
|
| + SyncSetupService* syncSetupService =
|
| + SyncSetupServiceFactory::GetForBrowserState(browserState);
|
| + DCHECK(syncSetupService);
|
| + SyncSetupService::SyncServiceState syncState =
|
| + syncSetupService->GetSyncServiceState();
|
| + switch (syncState) {
|
| + case SyncSetupService::kNoSyncServiceError:
|
| + return nil;
|
| + case SyncSetupService::kSyncServiceSignInNeedsUpdate:
|
| + return l10n_util::GetNSString(IDS_IOS_SYNC_ERROR_INFO_OUT_OF_DATE);
|
| + case SyncSetupService::kSyncServiceNeedsPassphrase:
|
| + return l10n_util::GetNSString(IDS_IOS_SYNC_CONFIGURE_ENCRYPTION);
|
| + case SyncSetupService::kSyncServiceServiceUnavailable:
|
| + return l10n_util::GetNSString(IDS_SYNC_SERVICE_UNAVAILABLE);
|
| + case SyncSetupService::kSyncServiceCouldNotConnect:
|
| + return l10n_util::GetNSString(IDS_IOS_SYNC_ERROR_COULD_NOT_CONNECT);
|
| + case SyncSetupService::kSyncServiceUnrecoverableError:
|
| + return l10n_util::GetNSString(IDS_IOS_SYNC_ERROR_UNRECOVERABLE);
|
| + }
|
| +}
|
| +
|
| +NSString* GetSyncErrorButtonTitleForBrowserState(
|
| + ios::ChromeBrowserState* browserState) {
|
| + SyncSetupService* syncSetupService =
|
| + SyncSetupServiceFactory::GetForBrowserState(browserState);
|
| + DCHECK(syncSetupService);
|
| + SyncSetupService::SyncServiceState syncState =
|
| + syncSetupService->GetSyncServiceState();
|
| + switch (syncState) {
|
| + case SyncSetupService::kSyncServiceSignInNeedsUpdate:
|
| + return l10n_util::GetNSString(IDS_IOS_SYNC_UPDATE_CREDENTIALS);
|
| + case SyncSetupService::kSyncServiceNeedsPassphrase:
|
| + return l10n_util::GetNSString(IDS_IOS_SYNC_ENTER_PASSPHRASE);
|
| + case SyncSetupService::kSyncServiceUnrecoverableError:
|
| + return l10n_util::GetNSString(IDS_IOS_SYNC_SIGN_IN_AGAIN);
|
| + default:
|
| + return nil;
|
| + }
|
| +}
|
| +
|
| +GenericChromeCommand* GetSyncCommandForBrowserState(
|
| + ios::ChromeBrowserState* browserState) {
|
| + SyncSetupService* syncSetupService =
|
| + SyncSetupServiceFactory::GetForBrowserState(browserState);
|
| + DCHECK(syncSetupService);
|
| + SyncSetupService::SyncServiceState syncState =
|
| + syncSetupService->GetSyncServiceState();
|
| + switch (syncState) {
|
| + case SyncSetupService::kSyncServiceSignInNeedsUpdate:
|
| + return [[[ShowSigninCommand alloc]
|
| + initWithOperation:AUTHENTICATION_OPERATION_REAUTHENTICATE
|
| + signInAccessPoint:signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN]
|
| + autorelease];
|
| + case SyncSetupService::kSyncServiceNeedsPassphrase:
|
| + return [[[GenericChromeCommand alloc]
|
| + initWithTag:IDC_SHOW_SYNC_PASSPHRASE_SETTINGS] autorelease];
|
| + case SyncSetupService::kSyncServiceCouldNotConnect:
|
| + case SyncSetupService::kSyncServiceServiceUnavailable:
|
| + case SyncSetupService::kSyncServiceUnrecoverableError:
|
| + case SyncSetupService::kNoSyncServiceError:
|
| + return [[[GenericChromeCommand alloc] initWithTag:IDC_SHOW_SYNC_SETTINGS]
|
| + autorelease];
|
| + }
|
| +}
|
| +
|
| +bool displaySyncErrors(ios::ChromeBrowserState* browser_state, Tab* tab) {
|
| + // Avoid displaying sync errors on incognito tabs.
|
| + if (browser_state->IsOffTheRecord())
|
| + return false;
|
| +
|
| + SyncSetupService* syncSetupService =
|
| + SyncSetupServiceFactory::GetForBrowserState(browser_state);
|
| + if (!syncSetupService)
|
| + return false;
|
| + SyncSetupService::SyncServiceState errorState =
|
| + syncSetupService->GetSyncServiceState();
|
| + if (IsTransientSyncError(errorState))
|
| + return false;
|
| +
|
| + // Logs when an infobar is shown to user. See crbug/265352.
|
| + int loggedErrorState = 0;
|
| + switch (errorState) {
|
| + case SyncSetupService::kNoSyncServiceError:
|
| + case SyncSetupService::kSyncServiceCouldNotConnect:
|
| + case SyncSetupService::kSyncServiceServiceUnavailable:
|
| + NOTREACHED();
|
| + break;
|
| + case SyncSetupService::kSyncServiceSignInNeedsUpdate:
|
| + loggedErrorState = SYNC_SIGN_IN_NEEDS_UPDATE;
|
| + break;
|
| + case SyncSetupService::kSyncServiceNeedsPassphrase:
|
| + loggedErrorState = SYNC_NEEDS_PASSPHRASE;
|
| + break;
|
| + case SyncSetupService::kSyncServiceUnrecoverableError:
|
| + loggedErrorState = SYNC_UNRECOVERABLE_ERROR;
|
| + break;
|
| + }
|
| + UMA_HISTOGRAM_ENUMERATION("Sync.SyncErrorInfobarDisplayed", loggedErrorState,
|
| + SYNC_ERROR_COUNT);
|
| +
|
| + DCHECK(tab);
|
| + DCHECK([tab infoBarManager]);
|
| + return SyncErrorInfoBarDelegate::Create([tab infoBarManager], browser_state);
|
| +}
|
| +
|
| +bool IsTransientSyncError(SyncSetupService::SyncServiceState errorState) {
|
| + switch (errorState) {
|
| + case SyncSetupService::kNoSyncServiceError:
|
| + case SyncSetupService::kSyncServiceCouldNotConnect:
|
| + case SyncSetupService::kSyncServiceServiceUnavailable:
|
| + return true;
|
| + case SyncSetupService::kSyncServiceSignInNeedsUpdate:
|
| + case SyncSetupService::kSyncServiceNeedsPassphrase:
|
| + case SyncSetupService::kSyncServiceUnrecoverableError:
|
| + return false;
|
| + }
|
| +}
|
| +
|
| +} // namespace sync
|
| +} // namespace ios_internal
|
|
|