| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync/sync_ui_util.h" | 5 #include "chrome/browser/sync/sync_ui_util.h" |
| 6 | 6 |
| 7 #include "base/i18n/number_formatting.h" | 7 #include "base/i18n/number_formatting.h" |
| 8 #include "base/i18n/time_formatting.h" | 8 #include "base/i18n/time_formatting.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 | 37 |
| 38 namespace sync_ui_util { | 38 namespace sync_ui_util { |
| 39 | 39 |
| 40 namespace { | 40 namespace { |
| 41 | 41 |
| 42 // Given an authentication state this helper function returns various labels | 42 // Given an authentication state this helper function returns various labels |
| 43 // that can be used to display information about the state. | 43 // that can be used to display information about the state. |
| 44 void GetStatusLabelsForAuthError(const AuthError& auth_error, | 44 void GetStatusLabelsForAuthError(const AuthError& auth_error, |
| 45 const ProfileSyncService& service, | 45 const ProfileSyncService& service, |
| 46 string16* status_label, | 46 string16* status_label, |
| 47 string16* link_label) { | 47 string16* link_label, |
| 48 string16* global_error_menu_label, |
| 49 string16* global_error_bubble_message, |
| 50 string16* global_error_bubble_accept_label) { |
| 48 string16 username = UTF8ToUTF16(service.profile()->GetPrefs()->GetString( | 51 string16 username = UTF8ToUTF16(service.profile()->GetPrefs()->GetString( |
| 49 prefs::kGoogleServicesUsername)); | 52 prefs::kGoogleServicesUsername)); |
| 50 string16 product_name = l10n_util::GetStringUTF16(IDS_PRODUCT_NAME); | 53 string16 product_name = l10n_util::GetStringUTF16(IDS_PRODUCT_NAME); |
| 51 if (link_label) | 54 if (link_label) |
| 52 link_label->assign(l10n_util::GetStringUTF16(IDS_SYNC_RELOGIN_LINK_LABEL)); | 55 link_label->assign(l10n_util::GetStringUTF16(IDS_SYNC_RELOGIN_LINK_LABEL)); |
| 53 | 56 |
| 54 switch (auth_error.state()) { | 57 switch (auth_error.state()) { |
| 55 case AuthError::INVALID_GAIA_CREDENTIALS: | 58 case AuthError::INVALID_GAIA_CREDENTIALS: |
| 56 case AuthError::ACCOUNT_DELETED: | 59 case AuthError::ACCOUNT_DELETED: |
| 57 case AuthError::ACCOUNT_DISABLED: | 60 case AuthError::ACCOUNT_DISABLED: |
| 58 // If the user name is empty then the first login failed, otherwise the | 61 // If the user name is empty then the first login failed, otherwise the |
| 59 // credentials are out-of-date. | 62 // credentials are out-of-date. |
| 60 if (username.empty()) { | 63 if (username.empty()) { |
| 61 if (status_label) { | 64 if (status_label) { |
| 62 status_label->assign( | 65 status_label->assign( |
| 63 l10n_util::GetStringUTF16(IDS_SYNC_INVALID_USER_CREDENTIALS)); | 66 l10n_util::GetStringUTF16(IDS_SYNC_INVALID_USER_CREDENTIALS)); |
| 64 } | 67 } |
| 65 } else { | 68 } else { |
| 66 if (status_label) { | 69 if (status_label) { |
| 67 status_label->assign( | 70 status_label->assign( |
| 68 l10n_util::GetStringUTF16(IDS_SYNC_LOGIN_INFO_OUT_OF_DATE)); | 71 l10n_util::GetStringUTF16(IDS_SYNC_LOGIN_INFO_OUT_OF_DATE)); |
| 69 } | 72 } |
| 73 if (global_error_menu_label) { |
| 74 global_error_menu_label->assign(l10n_util::GetStringUTF16( |
| 75 IDS_SYNC_SIGN_IN_ERROR_WRENCH_MENU_ITEM)); |
| 76 } |
| 77 if (global_error_bubble_message) { |
| 78 global_error_bubble_message->assign(l10n_util::GetStringFUTF16( |
| 79 IDS_SYNC_SIGN_IN_ERROR_BUBBLE_VIEW_MESSAGE, product_name)); |
| 80 } |
| 81 if (global_error_bubble_accept_label) { |
| 82 global_error_bubble_accept_label->assign(l10n_util::GetStringUTF16( |
| 83 IDS_SYNC_SIGN_IN_ERROR_BUBBLE_VIEW_ACCEPT)); |
| 84 } |
| 70 } | 85 } |
| 71 break; | 86 break; |
| 72 case AuthError::SERVICE_UNAVAILABLE: | 87 case AuthError::SERVICE_UNAVAILABLE: |
| 73 if (status_label) { | 88 if (status_label) { |
| 74 status_label->assign( | 89 status_label->assign( |
| 75 l10n_util::GetStringUTF16(IDS_SYNC_SERVICE_UNAVAILABLE)); | 90 l10n_util::GetStringUTF16(IDS_SYNC_SERVICE_UNAVAILABLE)); |
| 76 } | 91 } |
| 77 if (link_label) | 92 if (link_label) |
| 78 link_label->clear(); | 93 link_label->clear(); |
| 94 if (global_error_menu_label) { |
| 95 global_error_menu_label->assign(l10n_util::GetStringUTF16( |
| 96 IDS_SYNC_SIGN_IN_ERROR_WRENCH_MENU_ITEM)); |
| 97 } |
| 98 if (global_error_bubble_message) { |
| 99 global_error_bubble_message->assign(l10n_util::GetStringFUTF16( |
| 100 IDS_SYNC_UNAVAILABLE_ERROR_BUBBLE_VIEW_MESSAGE, product_name)); |
| 101 } |
| 102 if (global_error_bubble_accept_label) { |
| 103 global_error_bubble_accept_label->assign(l10n_util::GetStringUTF16( |
| 104 IDS_SYNC_UNAVAILABLE_ERROR_BUBBLE_VIEW_ACCEPT)); |
| 105 } |
| 79 break; | 106 break; |
| 80 case AuthError::CONNECTION_FAILED: | 107 case AuthError::CONNECTION_FAILED: |
| 81 // Note that there is little the user can do if the server is not | 108 // Note that there is little the user can do if the server is not |
| 82 // reachable. Since attempting to re-connect is done automatically by | 109 // reachable. Since attempting to re-connect is done automatically by |
| 83 // the Syncer, we do not show the (re)login link. | 110 // the Syncer, we do not show the (re)login link. |
| 84 if (status_label) { | 111 if (status_label) { |
| 85 status_label->assign( | 112 status_label->assign( |
| 86 l10n_util::GetStringFUTF16(IDS_SYNC_SERVER_IS_UNREACHABLE, | 113 l10n_util::GetStringFUTF16(IDS_SYNC_SERVER_IS_UNREACHABLE, |
| 87 product_name)); | 114 product_name)); |
| 88 } | 115 } |
| 89 break; | 116 break; |
| 90 default: | 117 default: |
| 91 if (status_label) { | 118 if (status_label) { |
| 92 status_label->assign(l10n_util::GetStringUTF16( | 119 status_label->assign(l10n_util::GetStringUTF16( |
| 93 IDS_SYNC_ERROR_SIGNING_IN)); | 120 IDS_SYNC_ERROR_SIGNING_IN)); |
| 94 } | 121 } |
| 122 if (global_error_menu_label) { |
| 123 global_error_menu_label->assign(l10n_util::GetStringUTF16( |
| 124 IDS_SYNC_SIGN_IN_ERROR_WRENCH_MENU_ITEM)); |
| 125 } |
| 126 if (global_error_bubble_message) { |
| 127 global_error_bubble_message->assign(l10n_util::GetStringFUTF16( |
| 128 IDS_SYNC_OTHER_SIGN_IN_ERROR_BUBBLE_VIEW_MESSAGE, product_name)); |
| 129 } |
| 130 if (global_error_bubble_accept_label) { |
| 131 global_error_bubble_accept_label->assign(l10n_util::GetStringUTF16( |
| 132 IDS_SYNC_SIGN_IN_ERROR_BUBBLE_VIEW_ACCEPT)); |
| 133 } |
| 95 break; | 134 break; |
| 96 } | 135 } |
| 97 } | 136 } |
| 98 | 137 |
| 99 // Returns the message that should be displayed when the user is authenticated | 138 // Returns the message that should be displayed when the user is authenticated |
| 100 // and can connect to the sync server. If the user hasn't yet authenticated, an | 139 // and can connect to the sync server. If the user hasn't yet authenticated, an |
| 101 // empty string is returned. | 140 // empty string is returned. |
| 102 string16 GetSyncedStateStatusLabel(ProfileSyncService* service, | 141 string16 GetSyncedStateStatusLabel(ProfileSyncService* service, |
| 103 StatusLabelStyle style) { | 142 StatusLabelStyle style) { |
| 104 if (!service->sync_initialized()) | 143 if (!service->sync_initialized()) |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 if (status_label) { | 229 if (status_label) { |
| 191 status_label->assign( | 230 status_label->assign( |
| 192 l10n_util::GetStringUTF16(IDS_SYNC_AUTHENTICATING_LABEL)); | 231 l10n_util::GetStringUTF16(IDS_SYNC_AUTHENTICATING_LABEL)); |
| 193 } | 232 } |
| 194 return PRE_SYNCED; | 233 return PRE_SYNCED; |
| 195 } | 234 } |
| 196 | 235 |
| 197 // No auth in progress check for an auth error. | 236 // No auth in progress check for an auth error. |
| 198 if (auth_error.state() != AuthError::NONE) { | 237 if (auth_error.state() != AuthError::NONE) { |
| 199 if (status_label && link_label) { | 238 if (status_label && link_label) { |
| 200 GetStatusLabelsForAuthError( | 239 GetStatusLabelsForAuthError(auth_error, *service, |
| 201 auth_error, *service, status_label, link_label); | 240 status_label, link_label, NULL, NULL, NULL); |
| 202 } | 241 } |
| 203 return SYNC_ERROR; | 242 return SYNC_ERROR; |
| 204 } | 243 } |
| 205 | 244 |
| 206 // We dont have an auth error. Check for protocol error. | 245 // We dont have an auth error. Check for protocol error. |
| 207 if (ShouldShowActionOnUI(status.sync_protocol_error)) { | 246 if (ShouldShowActionOnUI(status.sync_protocol_error)) { |
| 208 if (status_label) { | 247 if (status_label) { |
| 209 GetStatusForActionableError(status.sync_protocol_error, | 248 GetStatusForActionableError(status.sync_protocol_error, |
| 210 status_label); | 249 status_label); |
| 211 } | 250 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 } | 286 } |
| 248 if (signin.AuthInProgress()) { | 287 if (signin.AuthInProgress()) { |
| 249 if (status_label) { | 288 if (status_label) { |
| 250 status_label->assign( | 289 status_label->assign( |
| 251 l10n_util::GetStringUTF16(IDS_SYNC_AUTHENTICATING_LABEL)); | 290 l10n_util::GetStringUTF16(IDS_SYNC_AUTHENTICATING_LABEL)); |
| 252 } | 291 } |
| 253 } else if (auth_error.state() != AuthError::NONE && | 292 } else if (auth_error.state() != AuthError::NONE && |
| 254 auth_error.state() != AuthError::TWO_FACTOR) { | 293 auth_error.state() != AuthError::TWO_FACTOR) { |
| 255 if (status_label) { | 294 if (status_label) { |
| 256 status_label->clear(); | 295 status_label->clear(); |
| 257 GetStatusLabelsForAuthError(auth_error, *service, status_label, NULL); | 296 GetStatusLabelsForAuthError(auth_error, *service, status_label, NULL, |
| 297 NULL, NULL, NULL); |
| 258 } | 298 } |
| 259 result_type = SYNC_ERROR; | 299 result_type = SYNC_ERROR; |
| 260 } | 300 } |
| 261 } else if (service->HasUnrecoverableError()) { | 301 } else if (service->HasUnrecoverableError()) { |
| 262 result_type = SYNC_ERROR; | 302 result_type = SYNC_ERROR; |
| 263 ProfileSyncService::Status status; | 303 ProfileSyncService::Status status; |
| 264 service->QueryDetailedSyncStatus(&status); | 304 service->QueryDetailedSyncStatus(&status); |
| 265 if (ShouldShowActionOnUI(status.sync_protocol_error)) { | 305 if (ShouldShowActionOnUI(status.sync_protocol_error)) { |
| 266 if (status_label) { | 306 if (status_label) { |
| 267 GetStatusForActionableError(status.sync_protocol_error, | 307 GetStatusForActionableError(status.sync_protocol_error, |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 string16* menu_label, | 381 string16* menu_label, |
| 342 string16* bubble_message, | 382 string16* bubble_message, |
| 343 string16* bubble_accept_label) { | 383 string16* bubble_accept_label) { |
| 344 DCHECK(menu_label); | 384 DCHECK(menu_label); |
| 345 DCHECK(bubble_message); | 385 DCHECK(bubble_message); |
| 346 DCHECK(bubble_accept_label); | 386 DCHECK(bubble_accept_label); |
| 347 *menu_label = string16(); | 387 *menu_label = string16(); |
| 348 *bubble_message = string16(); | 388 *bubble_message = string16(); |
| 349 *bubble_accept_label = string16(); | 389 *bubble_accept_label = string16(); |
| 350 | 390 |
| 351 // Only display an error if we've completed sync setup. | |
| 352 if (!service->HasSyncSetupCompleted()) | 391 if (!service->HasSyncSetupCompleted()) |
| 353 return; | 392 return; |
| 354 | 393 |
| 355 // Display a passphrase error if we have one. | 394 MessageType status = GetStatus(service, signin); |
| 395 if (status == SYNC_ERROR) { |
| 396 const AuthError& auth_error = service->GetAuthError(); |
| 397 if (auth_error.state() != AuthError::NONE) { |
| 398 GetStatusLabelsForAuthError(auth_error, *service, NULL, NULL, |
| 399 menu_label, bubble_message, bubble_accept_label); |
| 400 // If we have an actionable auth error, display it. |
| 401 if (!menu_label->empty()) |
| 402 return; |
| 403 } |
| 404 } |
| 405 |
| 406 // No actionable auth error - display the passphrase error. |
| 356 if (service->IsPassphraseRequired() && | 407 if (service->IsPassphraseRequired() && |
| 357 service->IsPassphraseRequiredForDecryption()) { | 408 service->IsPassphraseRequiredForDecryption()) { |
| 358 // This is not the first machine so ask user to enter passphrase. | 409 // This is not the first machine so ask user to enter passphrase. |
| 359 *menu_label = l10n_util::GetStringUTF16( | 410 *menu_label = l10n_util::GetStringUTF16( |
| 360 IDS_SYNC_PASSPHRASE_ERROR_WRENCH_MENU_ITEM); | 411 IDS_SYNC_PASSPHRASE_ERROR_WRENCH_MENU_ITEM); |
| 361 string16 product_name = l10n_util::GetStringUTF16(IDS_PRODUCT_NAME); | 412 string16 product_name = l10n_util::GetStringUTF16(IDS_PRODUCT_NAME); |
| 362 *bubble_message = l10n_util::GetStringFUTF16( | 413 *bubble_message = l10n_util::GetStringFUTF16( |
| 363 IDS_SYNC_PASSPHRASE_ERROR_BUBBLE_VIEW_MESSAGE, product_name); | 414 IDS_SYNC_PASSPHRASE_ERROR_BUBBLE_VIEW_MESSAGE, product_name); |
| 364 *bubble_accept_label = l10n_util::GetStringUTF16( | 415 *bubble_accept_label = l10n_util::GetStringUTF16( |
| 365 IDS_SYNC_PASSPHRASE_ERROR_BUBBLE_VIEW_ACCEPT); | 416 IDS_SYNC_PASSPHRASE_ERROR_BUBBLE_VIEW_ACCEPT); |
| 366 return; | 417 return; |
| 367 } | 418 } |
| 368 } | 419 } |
| 369 | 420 |
| 370 MessageType GetStatus( | 421 MessageType GetStatus( |
| 371 ProfileSyncService* service, const SigninManager& signin) { | 422 ProfileSyncService* service, const SigninManager& signin) { |
| 372 return sync_ui_util::GetStatusInfo(service, signin, WITH_HTML, NULL, NULL); | 423 return sync_ui_util::GetStatusInfo(service, signin, WITH_HTML, NULL, NULL); |
| 373 } | 424 } |
| 374 | 425 |
| 426 string16 GetSyncMenuLabel( |
| 427 ProfileSyncService* service, const SigninManager& signin) { |
| 428 MessageType type = GetStatus(service, signin); |
| 429 |
| 430 if (type == sync_ui_util::SYNCED) |
| 431 return l10n_util::GetStringUTF16(IDS_SYNC_MENU_SYNCED_LABEL); |
| 432 else if (type == sync_ui_util::SYNC_ERROR) |
| 433 return l10n_util::GetStringUTF16(IDS_SYNC_MENU_SYNC_ERROR_LABEL); |
| 434 else |
| 435 return l10n_util::GetStringUTF16(IDS_SYNC_START_SYNC_BUTTON_LABEL); |
| 436 } |
| 437 |
| 375 string16 ConstructTime(int64 time_in_int) { | 438 string16 ConstructTime(int64 time_in_int) { |
| 376 base::Time time = base::Time::FromInternalValue(time_in_int); | 439 base::Time time = base::Time::FromInternalValue(time_in_int); |
| 377 | 440 |
| 378 // If time is null the format function returns a time in 1969. | 441 // If time is null the format function returns a time in 1969. |
| 379 if (time.is_null()) | 442 if (time.is_null()) |
| 380 return string16(); | 443 return string16(); |
| 381 return base::TimeFormatFriendlyDateAndTime(time); | 444 return base::TimeFormatFriendlyDateAndTime(time); |
| 382 } | 445 } |
| 383 | 446 |
| 447 std::string MakeSyncAuthErrorText( |
| 448 const GoogleServiceAuthError::State& state) { |
| 449 switch (state) { |
| 450 case GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS: |
| 451 case GoogleServiceAuthError::ACCOUNT_DELETED: |
| 452 case GoogleServiceAuthError::ACCOUNT_DISABLED: |
| 453 case GoogleServiceAuthError::SERVICE_UNAVAILABLE: |
| 454 return "INVALID_GAIA_CREDENTIALS"; |
| 455 case GoogleServiceAuthError::USER_NOT_SIGNED_UP: |
| 456 return "USER_NOT_SIGNED_UP"; |
| 457 case GoogleServiceAuthError::CONNECTION_FAILED: |
| 458 return "CONNECTION_FAILED"; |
| 459 default: |
| 460 return std::string(); |
| 461 } |
| 462 } |
| 463 |
| 384 } // namespace sync_ui_util | 464 } // namespace sync_ui_util |
| OLD | NEW |