sync_global_error.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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_global_error.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_observer.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/sync_ui_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service_factory.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncGlobalError::SyncGlobalError(ProfileSyncService* service,
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 SigninManagerBase* signin)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : service_(service),
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      signin_(signin) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(service_);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(signin_);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnStateChanged();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncGlobalError::~SyncGlobalError() {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncGlobalError::HasMenuItem() {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !menu_label_.empty();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SyncGlobalError::MenuItemCommandID() {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return IDC_SHOW_SIGNIN_ERROR;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 SyncGlobalError::MenuItemLabel() {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return menu_label_;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncGlobalError::ExecuteMenuItem(Browser* browser) {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LoginUIService* login_ui = LoginUIServiceFactory::GetForProfile(
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      service_->profile());
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (login_ui->current_login_ui()) {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    login_ui->current_login_ui()->FocusUI();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Need to navigate to the settings page and display the UI.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::ShowSettingsSubPage(browser, chrome::kSyncSetupSubPage);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncGlobalError::HasBubbleView() {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !bubble_message_.empty() && !bubble_accept_label_.empty();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 SyncGlobalError::GetBubbleViewTitle() {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_SYNC_ERROR_BUBBLE_VIEW_TITLE);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::vector<base::string16> SyncGlobalError::GetBubbleViewMessages() {
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return std::vector<base::string16>(1, bubble_message_);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 SyncGlobalError::GetBubbleViewAcceptButtonLabel() {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return bubble_accept_label_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 SyncGlobalError::GetBubbleViewCancelButtonLabel() {
76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return base::string16();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncGlobalError::OnBubbleViewDidClose(Browser* browser) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncGlobalError::BubbleViewAcceptButtonPressed(Browser* browser) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExecuteMenuItem(browser);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncGlobalError::BubbleViewCancelButtonPressed(Browser* browser) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncGlobalError::OnStateChanged() {
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 menu_label;
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 bubble_message;
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 bubble_accept_label;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_ui_util::GetStatusLabelsForSyncGlobalError(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service_, *signin_, &menu_label, &bubble_message, &bubble_accept_label);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All the labels should be empty or all of them non-empty.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK((menu_label.empty() && bubble_message.empty() &&
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          bubble_accept_label.empty()) ||
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (!menu_label.empty() && !bubble_message.empty() &&
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          !bubble_accept_label.empty()));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (menu_label != menu_label_ || bubble_message != bubble_message_ ||
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bubble_accept_label != bubble_accept_label_) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    menu_label_ = menu_label;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bubble_message_ = bubble_message;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bubble_accept_label_ = bubble_accept_label;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Profile can be NULL during tests.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile = service_->profile();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (profile) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GlobalErrorServiceFactory::GetForProfile(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          profile)->NotifyErrorsChanged(this);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
117