Index: ios/chrome/browser/ui/sync/sync_error_infobar_delegate.mm |
diff --git a/ios/chrome/browser/ui/sync/sync_error_infobar_delegate.mm b/ios/chrome/browser/ui/sync/sync_error_infobar_delegate.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3e65ca43087cf7a6832d15837f470c22315d7a5f |
--- /dev/null |
+++ b/ios/chrome/browser/ui/sync/sync_error_infobar_delegate.mm |
@@ -0,0 +1,125 @@ |
+// Copyright 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ios/chrome/browser/ui/sync/sync_error_infobar_delegate.h" |
+ |
+#import <UIKit/UIKit.h> |
+ |
+#include <utility> |
+ |
+#include "base/logging.h" |
+#include "base/mac/scoped_nsobject.h" |
+#include "base/memory/ptr_util.h" |
+#include "base/strings/sys_string_conversions.h" |
+#include "components/browser_sync/profile_sync_service.h" |
+#include "components/infobars/core/infobar.h" |
+#include "components/infobars/core/infobar_delegate.h" |
+#include "components/infobars/core/infobar_manager.h" |
+#include "components/sync/driver/sync_service.h" |
+#import "ios/chrome/browser/browser_state/chrome_browser_state.h" |
+#include "ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h" |
+#include "ios/chrome/browser/sync/sync_setup_service.h" |
+#include "ios/chrome/browser/sync/sync_setup_service_factory.h" |
+#import "ios/chrome/browser/ui/commands/UIKit+ChromeExecuteCommand.h" |
+#import "ios/chrome/browser/ui/commands/generic_chrome_command.h" |
+#import "ios/chrome/browser/ui/sync/sync_util.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+// static |
+bool SyncErrorInfoBarDelegate::Create(infobars::InfoBarManager* infobar_manager, |
+ ios::ChromeBrowserState* browser_state) { |
+ DCHECK(infobar_manager); |
+ std::unique_ptr<ConfirmInfoBarDelegate> delegate( |
+ new SyncErrorInfoBarDelegate(browser_state)); |
+ return !!infobar_manager->AddInfoBar( |
+ infobar_manager->CreateConfirmInfoBar(std::move(delegate))); |
+} |
+ |
+SyncErrorInfoBarDelegate::SyncErrorInfoBarDelegate( |
+ ios::ChromeBrowserState* browser_state) |
+ : browser_state_(browser_state) { |
+ DCHECK(!browser_state->IsOffTheRecord()); |
+ icon_ = gfx::Image([UIImage imageNamed:@"infobar_warning"]); |
+ SyncSetupService* sync_setup_service = |
+ SyncSetupServiceFactory::GetForBrowserState(browser_state); |
+ DCHECK(sync_setup_service); |
+ // Set all of the UI based on the sync state at the same time to ensure |
+ // they all correspond to the same sync error. |
+ error_state_ = sync_setup_service->GetSyncServiceState(); |
+ message_ = base::SysNSStringToUTF16( |
+ ios_internal::sync::GetSyncErrorMessageForBrowserState(browser_state_)); |
+ button_text_ = base::SysNSStringToUTF16( |
+ ios_internal::sync::GetSyncErrorButtonTitleForBrowserState( |
+ browser_state_)); |
+ command_.reset([ios_internal::sync::GetSyncCommandForBrowserState( |
+ browser_state_) retain]); |
+ |
+ // Register for sync status changes. |
+ syncer::SyncService* sync_service = |
+ IOSChromeProfileSyncServiceFactory::GetForBrowserState(browser_state_); |
+ sync_service->AddObserver(this); |
+} |
+ |
+SyncErrorInfoBarDelegate::~SyncErrorInfoBarDelegate() { |
+ syncer::SyncService* sync_service = |
+ IOSChromeProfileSyncServiceFactory::GetForBrowserState(browser_state_); |
+ sync_service->RemoveObserver(this); |
+} |
+ |
+infobars::InfoBarDelegate::InfoBarIdentifier |
+SyncErrorInfoBarDelegate::GetIdentifier() const { |
+ return SYNC_ERROR_INFOBAR_DELEGATE; |
+} |
+ |
+base::string16 SyncErrorInfoBarDelegate::GetMessageText() const { |
+ return message_; |
+} |
+ |
+int SyncErrorInfoBarDelegate::GetButtons() const { |
+ return button_text_.empty() ? BUTTON_NONE : BUTTON_OK; |
+} |
+ |
+base::string16 SyncErrorInfoBarDelegate::GetButtonLabel( |
+ InfoBarButton button) const { |
+ DCHECK(button == BUTTON_OK); |
+ return button_text_; |
+} |
+ |
+gfx::Image SyncErrorInfoBarDelegate::GetIcon() const { |
+ return icon_; |
+} |
+ |
+bool SyncErrorInfoBarDelegate::Accept() { |
+ DCHECK(command_); |
+ UIWindow* main_window = [[UIApplication sharedApplication] keyWindow]; |
+ DCHECK(main_window); |
+ [main_window chromeExecuteCommand:command_]; |
+ return false; |
+} |
+ |
+void SyncErrorInfoBarDelegate::OnStateChanged() { |
+ // If the inforbar is in the process of being removed, nothing must be done. |
+ infobars::InfoBar* infobar = this->infobar(); |
+ if (!infobar) |
+ return; |
+ SyncSetupService* sync_setup_service = |
+ SyncSetupServiceFactory::GetForBrowserState(browser_state_); |
+ SyncSetupService::SyncServiceState new_error_state = |
+ sync_setup_service->GetSyncServiceState(); |
+ if (error_state_ == new_error_state) |
+ return; |
+ error_state_ = new_error_state; |
+ if (ios_internal::sync::IsTransientSyncError(new_error_state)) { |
+ infobar->RemoveSelf(); |
+ } else { |
+ infobars::InfoBarManager* infobar_manager = infobar->owner(); |
+ if (infobar_manager) { |
+ std::unique_ptr<ConfirmInfoBarDelegate> new_infobar_delegate( |
+ new SyncErrorInfoBarDelegate(browser_state_)); |
+ infobar_manager->ReplaceInfoBar(infobar, |
+ infobar_manager->CreateConfirmInfoBar( |
+ std::move(new_infobar_delegate))); |
+ } |
+ } |
+} |