172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/theme_installed_infobar_delegate.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h"
1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/themes/theme_service.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/themes/theme_service_factory.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/theme_resources.h"
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochThemeInstalledInfoBarDelegate::ThemeInstalledInfoBarDelegate(
234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    TabContents* tab_contents,
244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    const Extension* new_theme,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string& previous_theme_id)
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : ConfirmInfoBarDelegate(tab_contents),
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      profile_(tab_contents->profile()),
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      theme_service_(ThemeServiceFactory::GetForProfile(profile_)),
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      name_(new_theme->name()),
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      theme_id_(new_theme->id()),
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      previous_theme_id_(previous_theme_id),
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab_contents_(tab_contents) {
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  theme_service_->OnInfobarDisplayed();
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.Add(this, NotificationType::BROWSER_THEME_CHANGED,
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 NotificationService::AllSources());
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool ThemeInstalledInfoBarDelegate::MatchesTheme(const Extension* theme) const {
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return theme && (theme->id() == theme_id_);
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochThemeInstalledInfoBarDelegate::~ThemeInstalledInfoBarDelegate() {
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We don't want any notifications while we're running our destructor.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  registrar_.RemoveAll();
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  theme_service_->OnInfobarDestroyed();
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool ThemeInstalledInfoBarDelegate::Cancel() {
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!previous_theme_id_.empty()) {
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ExtensionService* service = profile_->GetExtensionService();
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (service) {
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const Extension* previous_theme =
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          service->GetExtensionById(previous_theme_id_, true);
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      if (previous_theme) {
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        theme_service_->SetTheme(previous_theme);
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        return true;
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      }
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  theme_service_->UseDefaultTheme();
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return true;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ThemeInstalledInfoBarDelegate::InfoBarClosed() {
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delete this;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochSkBitmap* ThemeInstalledInfoBarDelegate::GetIcon() const {
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(aa): Reply with the theme's icon, but this requires reading it
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // asynchronously from disk.
734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  return ResourceBundle::GetSharedInstance().GetBitmapNamed(IDR_INFOBAR_THEME);
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochThemeInstalledInfoBarDelegate*
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ThemeInstalledInfoBarDelegate::AsThemePreviewInfobarDelegate() {
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return this;
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 ThemeInstalledInfoBarDelegate::GetMessageText() const {
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return l10n_util::GetStringFUTF16(IDS_THEME_INSTALL_INFOBAR_LABEL,
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                    UTF8ToUTF16(name_));
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint ThemeInstalledInfoBarDelegate::GetButtons() const {
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return BUTTON_CANCEL;
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstring16 ThemeInstalledInfoBarDelegate::GetButtonLabel(
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    InfoBarButton button) const {
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK_EQ(BUTTON_CANCEL, button);
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return l10n_util::GetStringUTF16(IDS_THEME_INSTALL_INFOBAR_UNDO_BUTTON);
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ThemeInstalledInfoBarDelegate::Observe(
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NotificationType type,
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const NotificationSource& source,
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const NotificationDetails& details) {
1004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DCHECK_EQ(NotificationType::BROWSER_THEME_CHANGED, type.value);
1014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // If the new theme is different from what this info bar is associated
1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // with, close this info bar since it is no longer relevant.
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (theme_id_ != theme_service_->GetThemeID()) {
104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (tab_contents_ && !tab_contents_->is_being_destroyed()) {
105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      tab_contents_->RemoveInfoBar(this);
106201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // The infobar is gone so there is no reason for this delegate to keep
107201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // a pointer to the TabContents (the TabContents has deleted its
108201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // reference to this delegate and a new delegate will be created if
109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // a new infobar is created).
110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      tab_contents_ = NULL;
111201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // Although it's not being used anymore, this delegate is never deleted.
112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // It can not be deleted now because it is still needed if we
113201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // "undo" the theme change that triggered this notification
114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // (when InfoBar::OnBackgroundExpose() is called). This will likely
115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // be fixed when infobar delegate deletion is cleaned up for
116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      // http://crbug.com/62154.
117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
120