Index: chrome/browser/extensions/app_notify_channel_ui.cc |
diff --git a/chrome/browser/extensions/app_notify_channel_ui.cc b/chrome/browser/extensions/app_notify_channel_ui.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..321013f86a8f9d99bf9f34ab25dc8ba1b8233ef0 |
--- /dev/null |
+++ b/chrome/browser/extensions/app_notify_channel_ui.cc |
@@ -0,0 +1,145 @@ |
+// Copyright (c) 2011 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 "chrome/browser/extensions/app_notify_channel_ui.h" |
+ |
+#include "base/utf_string_conversions.h" |
+#include "chrome/browser/infobars/infobar_tab_helper.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/sync/profile_sync_service.h" |
+#include "chrome/browser/sync/sync_setup_wizard.h" |
+#include "chrome/browser/tab_contents/confirm_infobar_delegate.h" |
+#include "chrome/browser/ui/browser.h" |
+#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
+#include "content/public/browser/notification_details.h" |
+#include "content/public/browser/notification_observer.h" |
+#include "content/public/browser/notification_registrar.h" |
+#include "content/public/browser/notification_source.h" |
+#include "content/public/browser/notification_service.h" |
+#include "content/public/browser/notification_types.h" |
+#include "grit/generated_resources.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+class AppNotifyChannelUIImpl::InfoBar : public ConfirmInfoBarDelegate { |
+ public: |
+ InfoBar(AppNotifyChannelUIImpl* creator, |
+ InfoBarTabHelper* helper, |
+ const std::string& app_name); |
+ virtual ~InfoBar(); |
+ |
+ // ConfirmInfoBarDelegate. |
+ virtual string16 GetMessageText() const OVERRIDE; |
+ virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE; |
+ virtual bool Accept() OVERRIDE; |
+ virtual bool Cancel() OVERRIDE; |
+ virtual void InfoBarDismissed() OVERRIDE; |
+ |
+ private: |
+ AppNotifyChannelUIImpl* creator_; |
+ std::string app_name_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(InfoBar); |
+}; |
+ |
+AppNotifyChannelUIImpl::InfoBar::InfoBar( |
+ AppNotifyChannelUIImpl* creator, |
+ InfoBarTabHelper* helper, |
+ const std::string& app_name) |
+ : ConfirmInfoBarDelegate(helper), creator_(creator), app_name_(app_name) { |
+} |
+ |
+AppNotifyChannelUIImpl::InfoBar::~InfoBar() {} |
+ |
+string16 AppNotifyChannelUIImpl::InfoBar::GetMessageText() const { |
+ return l10n_util::GetStringFUTF16(IDS_APP_NOTIFICATION_NEED_SIGNIN, |
+ UTF8ToUTF16(app_name_)); |
+} |
+ |
+string16 AppNotifyChannelUIImpl::InfoBar::GetButtonLabel( |
+ InfoBarButton button) const { |
+ if (button == BUTTON_OK) { |
+ return l10n_util::GetStringUTF16(IDS_APP_NOTIFICATION_NEED_SIGNIN_ACCEPT); |
+ } else if (button == BUTTON_CANCEL) { |
+ return l10n_util::GetStringUTF16(IDS_APP_NOTIFICATION_NEED_SIGNIN_CANCEL); |
+ } else { |
+ NOTREACHED(); |
+ } |
+ return string16(); |
+} |
+ |
+bool AppNotifyChannelUIImpl::InfoBar::Accept() { |
+ creator_->OnInfoBarResult(true); |
+ return true; |
+} |
+ |
+bool AppNotifyChannelUIImpl::InfoBar::Cancel() { |
+ creator_->OnInfoBarResult(false); |
+ return true; |
+} |
+ |
+void AppNotifyChannelUIImpl::InfoBar::InfoBarDismissed() { |
+ Cancel(); |
+} |
+ |
+ |
+AppNotifyChannelUIImpl::AppNotifyChannelUIImpl(Browser* browser, |
+ TabContentsWrapper* wrapper, |
+ const std::string& app_name) |
+ : browser_(browser), wrapper_(wrapper), app_name_(app_name), |
+ delegate_(NULL), observing_sync_(false), got_first_sync_callback_(false) { |
+} |
+ |
+AppNotifyChannelUIImpl::~AppNotifyChannelUIImpl() { |
+ // We should have either not started observing sync, or already called |
+ // StopObservingSync by this point. |
+ CHECK(!observing_sync_); |
+} |
+ |
+void AppNotifyChannelUIImpl::PromptSyncSetup( |
+ AppNotifyChannelUI::Delegate* delegate) { |
+ CHECK(delegate_ == NULL); |
+ delegate_ = delegate; |
+ |
+ if (!browser_->profile()->HasProfileSyncService()) { |
+ delegate_->OnSyncSetupResult(false); |
+ return; |
+ } |
+ |
+ InfoBarTabHelper* helper = wrapper_->infobar_tab_helper(); |
+ helper->AddInfoBar(new AppNotifyChannelUIImpl::InfoBar( |
+ this, helper, app_name_)); |
+} |
+ |
+void AppNotifyChannelUIImpl::OnInfoBarResult(bool accepted) { |
+ if (accepted) { |
+ StartObservingSync(); |
+ browser_->ShowSyncSetup(); |
+ } else { |
+ delegate_->OnSyncSetupResult(false); |
+ } |
+} |
+ |
+void AppNotifyChannelUIImpl::OnStateChanged() { |
+ ProfileSyncService* sync_service = |
+ browser_->profile()->GetProfileSyncService(); |
+ bool finished = got_first_sync_callback_ && !sync_service->SetupInProgress(); |
+ got_first_sync_callback_ = true; |
+ |
+ if (finished) { |
+ StopObservingSync(); |
+ delegate_->OnSyncSetupResult(sync_service->HasSyncSetupCompleted()); |
+ } |
+} |
+ |
+void AppNotifyChannelUIImpl::StartObservingSync() { |
+ CHECK(!observing_sync_); |
+ observing_sync_ = true; |
+ browser_->profile()->GetProfileSyncService()->AddObserver(this); |
+} |
+ |
+void AppNotifyChannelUIImpl::StopObservingSync() { |
+ CHECK(observing_sync_); |
+ observing_sync_ = false; |
+ browser_->profile()->GetProfileSyncService()->RemoveObserver(this); |
+} |