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