15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/sync_ui_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/number_formatting.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/time_formatting.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/signin/signin_ui_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/chromium_strings.h"
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/locale_settings.h"
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h"
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/signin_error_controller.h"
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/signin_manager_base.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/sessions/sync_session_snapshot.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/proto_enum_conversions.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync_protocol_error.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS)
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h"
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef GoogleServiceAuthError AuthError;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sync_ui_util {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the message that should be displayed when the user is authenticated
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and can connect to the sync server. If the user hasn't yet authenticated, an
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// empty string is returned.
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 GetSyncedStateStatusLabel(ProfileSyncService* service,
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         const SigninManagerBase& signin,
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         StatusLabelStyle style) {
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string user_display_name = signin.GetAuthenticatedUsername();
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS)
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (user_manager::UserManager::IsInitialized()) {
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // On CrOS user email is sanitized and then passed to the signin manager.
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Original email (containing dots) is stored as "display email".
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    user_display_name = user_manager::UserManager::Get()->GetUserDisplayEmail(
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        user_display_name);
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 user_name = base::UTF8ToUTF16(user_display_name);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!user_name.empty()) {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!service || service->IsManaged()) {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // User is signed in, but sync is disabled.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return l10n_util::GetStringFUTF16(IDS_SIGNED_IN_WITH_SYNC_DISABLED,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        user_name);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (service->IsStartSuppressed()) {
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // User is signed in, but sync has been stopped.
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return l10n_util::GetStringFUTF16(IDS_SIGNED_IN_WITH_SYNC_SUPPRESSED,
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                        user_name);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!service || !service->sync_initialized()) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // User is not signed in, or sync is still initializing.
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return base::string16();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!user_name.empty());
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message may also carry additional advice with an HTML link, if acceptable.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (style) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PLAIN_TEXT:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringFUTF16(
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_SYNC_ACCOUNT_SYNCING_TO_USER,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          user_name);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case WITH_HTML:
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringFUTF16(
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_SYNC_ACCOUNT_SYNCING_TO_USER_WITH_MANAGE_LINK,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          user_name,
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          base::ASCIIToUTF16(chrome::kSyncGoogleDashboardURL));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetStatusForActionableError(
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const syncer::SyncProtocolError& error,
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16* status_label) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(status_label);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (error.action) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::STOP_AND_RESTART_SYNC:
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       status_label->assign(
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           l10n_util::GetStringUTF16(IDS_SYNC_STOP_AND_RESTART_SYNC));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::UPGRADE_CLIENT:
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       status_label->assign(
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           l10n_util::GetStringFUTF16(IDS_SYNC_UPGRADE_CLIENT,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::ENABLE_SYNC_ON_ACCOUNT:
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       status_label->assign(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           l10n_util::GetStringUTF16(IDS_SYNC_ENABLE_SYNC_ON_ACCOUNT));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::CLEAR_USER_DATA_AND_RESYNC:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       status_label->assign(
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           l10n_util::GetStringUTF16(IDS_SYNC_CLEAR_USER_DATA));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(akalin): Write unit tests for these three functions below.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// status_label and link_label must either be both NULL or both non-NULL.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageType GetStatusInfo(ProfileSyncService* service,
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                          const SigninManagerBase& signin,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          StatusLabelStyle style,
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                          base::string16* status_label,
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                          base::string16* link_label) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(status_label == NULL, link_label == NULL);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageType result_type(SYNCED);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!signin.IsAuthenticated())
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PRE_SYNCED;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!service || service->IsManaged() || service->HasSyncSetupCompleted() ||
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      service->IsStartSuppressed()) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The order or priority is going to be: 1. Unrecoverable errors.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 2. Auth errors. 3. Protocol errors. 4. Passphrase errors.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (service && service->HasUnrecoverableError()) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (status_label) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status_label->assign(l10n_util::GetStringFUTF16(
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            IDS_SYNC_STATUS_UNRECOVERABLE_ERROR,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            l10n_util::GetStringUTF16(IDS_SYNC_UNRECOVERABLE_ERROR_HELP_URL)));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return SYNC_ERROR;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For auth errors first check if an auth is in progress.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (signin.AuthInProgress()) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (status_label) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status_label->assign(
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          l10n_util::GetStringUTF16(IDS_SYNC_AUTHENTICATING_LABEL));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return PRE_SYNCED;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
168558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    // Check for sync errors if the sync service is enabled.
169558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    if (service) {
170558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      // Since there is no auth in progress, check for an auth error first.
171558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      AuthError auth_error =
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ProfileOAuth2TokenServiceFactory::GetForProfile(service->profile())->
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              signin_error_controller()->auth_error();
174558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      if (auth_error.state() != AuthError::NONE) {
175558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        if (status_label && link_label)
176558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          signin_ui_util::GetStatusLabelsForAuthError(
177558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch              service->profile(), signin, status_label, link_label);
178558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch        return SYNC_ERROR;
179558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
181558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      // We don't have an auth error. Check for an actionable error.
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ProfileSyncService::Status status;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      service->QueryDetailedSyncStatus(&status);
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (ShouldShowActionOnUI(status.sync_protocol_error)) {
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (status_label) {
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          GetStatusForActionableError(status.sync_protocol_error,
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      status_label);
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return SYNC_ERROR;
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Check for a passphrase error.
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (service->IsPassphraseRequired()) {
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (service->IsPassphraseRequiredForDecryption()) {
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          // TODO(lipalani) : Ask tim if this is still needed.
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          // NOT first machine.
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          // Show a link ("needs attention"), but still indicate the
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          // current synced status.  Return SYNC_PROMO so that
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          // the configure link will still be shown.
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if (status_label && link_label) {
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            status_label->assign(GetSyncedStateStatusLabel(
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                service, signin, style));
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            link_label->assign(
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                l10n_util::GetStringUTF16(IDS_SYNC_PASSWORD_SYNC_ATTENTION));
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          return SYNC_PROMO;
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // Check to see if sync has been disabled via the dasboard and needs to be
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // set up once again.
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (service->IsStartSuppressed() &&
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          status.sync_protocol_error.error_type == syncer::NOT_MY_BIRTHDAY) {
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (status_label) {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          status_label->assign(GetSyncedStateStatusLabel(service,
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                         signin,
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                         style));
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return PRE_SYNCED;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // There is no error. Display "Last synced..." message.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (status_label)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      status_label->assign(GetSyncedStateStatusLabel(service, signin, style));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SYNCED;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Either show auth error information with a link to re-login, auth in prog,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // or provide a link to continue with setup.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (service->FirstSetupInProgress()) {
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_type = PRE_SYNCED;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncService::Status status;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service->QueryDetailedSyncStatus(&status);
2347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      AuthError auth_error =
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          ProfileOAuth2TokenServiceFactory::GetForProfile(service->profile())->
236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              signin_error_controller()->auth_error();
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (status_label) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status_label->assign(
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            l10n_util::GetStringUTF16(IDS_SYNC_NTP_SETUP_IN_PROGRESS));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (signin.AuthInProgress()) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (status_label) {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          status_label->assign(
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              l10n_util::GetStringUTF16(IDS_SYNC_AUTHENTICATING_LABEL));
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (auth_error.state() != AuthError::NONE &&
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 auth_error.state() != AuthError::TWO_FACTOR) {
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if (status_label && link_label) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          status_label->clear();
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          signin_ui_util::GetStatusLabelsForAuthError(
2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              service->profile(), signin, status_label, link_label);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result_type = SYNC_ERROR;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (service->HasUnrecoverableError()) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_type = SYNC_ERROR;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncService::Status status;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service->QueryDetailedSyncStatus(&status);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (ShouldShowActionOnUI(status.sync_protocol_error)) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (status_label) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetStatusForActionableError(status.sync_protocol_error,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              status_label);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (status_label) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status_label->assign(l10n_util::GetStringUTF16(IDS_SYNC_SETUP_ERROR));
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    } else if (signin.IsAuthenticated()) {
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      // The user is signed in, but sync has been stopped.
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (status_label) {
270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        base::string16 label = l10n_util::GetStringFUTF16(
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            IDS_SIGNED_IN_WITH_SYNC_SUPPRESSED,
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base::UTF8ToUTF16(signin.GetAuthenticatedUsername()));
27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        status_label->assign(label);
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        result_type = PRE_SYNCED;
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result_type;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the status info for use on the new tab page, where we want slightly
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// different information than in the settings panel.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageType GetStatusInfoForNewTabPage(ProfileSyncService* service,
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       const SigninManagerBase& signin,
285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       base::string16* status_label,
286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       base::string16* link_label) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(status_label);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(link_label);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (service->HasSyncSetupCompleted() &&
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service->IsPassphraseRequired()) {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (service->passphrase_required_reason() == syncer::REASON_ENCRYPTION) {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // First machine migrating to passwords.  Show as a promotion.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (status_label && link_label) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        status_label->assign(
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            l10n_util::GetStringFUTF16(
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_SYNC_NTP_PASSWORD_PROMO,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        link_label->assign(
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            l10n_util::GetStringUTF16(IDS_SYNC_NTP_PASSWORD_ENABLE));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return SYNC_PROMO;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // NOT first machine.
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Show a link and present as an error ("needs attention").
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (status_label && link_label) {
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        status_label->assign(base::string16());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        link_label->assign(
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            l10n_util::GetStringUTF16(IDS_SYNC_CONFIGURE_ENCRYPTION));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return SYNC_ERROR;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fallback to default.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetStatusInfo(service, signin, WITH_HTML, status_label, link_label);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageType GetStatusLabels(ProfileSyncService* service,
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            const SigninManagerBase& signin,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            StatusLabelStyle style,
324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            base::string16* status_label,
325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            base::string16* link_label) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(status_label);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(link_label);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sync_ui_util::GetStatusInfo(
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service, signin, style, status_label, link_label);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageType GetStatusLabelsForNewTabPage(ProfileSyncService* service,
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         const SigninManagerBase& signin,
334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                         base::string16* status_label,
335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                         base::string16* link_label) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(status_label);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(link_label);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sync_ui_util::GetStatusInfoForNewTabPage(
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service, signin, status_label, link_label);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
342effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if !defined(OS_CHROMEOS)
343effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid GetStatusLabelsForSyncGlobalError(const ProfileSyncService* service,
344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       base::string16* menu_label,
345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       base::string16* bubble_message,
346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       base::string16* bubble_accept_label) {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(menu_label);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(bubble_message);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(bubble_accept_label);
350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  *menu_label = base::string16();
351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  *bubble_message = base::string16();
352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  *bubble_accept_label = base::string16();
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Only display an error if we've completed sync setup.
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!service->HasSyncSetupCompleted())
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Display a passphrase error if we have one.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (service->IsPassphraseRequired() &&
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service->IsPassphraseRequiredForDecryption()) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This is not the first machine so ask user to enter passphrase.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *menu_label = l10n_util::GetStringUTF16(
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_SYNC_PASSPHRASE_ERROR_WRENCH_MENU_ITEM);
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    *bubble_message = l10n_util::GetStringUTF16(
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        IDS_SYNC_PASSPHRASE_ERROR_BUBBLE_VIEW_MESSAGE);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *bubble_accept_label = l10n_util::GetStringUTF16(
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_SYNC_PASSPHRASE_ERROR_BUBBLE_VIEW_ACCEPT);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
371effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageType GetStatus(
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ProfileSyncService* service, const SigninManagerBase& signin) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sync_ui_util::GetStatusInfo(service, signin, WITH_HTML, NULL, NULL);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ConstructTime(int64 time_in_int) {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time time = base::Time::FromInternalValue(time_in_int);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If time is null the format function returns a time in 1969.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (time.is_null())
383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return base::string16();
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::TimeFormatFriendlyDateAndTime(time);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace sync_ui_util
388