keystone_infobar_delegate.mm revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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/ui/cocoa/keystone_infobar_delegate.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import <AppKit/AppKit.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop/message_loop.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/prefs/pref_service.h"
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/first_run/first_run.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/infobars/confirm_infobar_delegate.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/infobars/infobar.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import "chrome/browser/mac/keystone_glue.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KeystonePromotionInfoBarDelegate -------------------------------------------
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class KeystonePromotionInfoBarDelegate : public ConfirmInfoBarDelegate {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If there's an active tab, creates a keystone promotion delegate and adds it
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to the InfoBarService associated with that tab.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void Create();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit KeystonePromotionInfoBarDelegate(PrefService* prefs);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~KeystonePromotionInfoBarDelegate();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets this info bar to be able to expire.  Called a predetermined amount
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of time after this object is created.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCanExpire() { can_expire_ = true; }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ConfirmInfoBarDelegate
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetIconID() const OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::string16 GetMessageText() const OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Accept() OVERRIDE;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Cancel() OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ShouldExpireInternal(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const NavigationDetails& details) const OVERRIDE;
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The prefs to use.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs_;  // weak
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the info bar should be dismissed on the next navigation.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool can_expire_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to delay the expiration of the info bar.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<KeystonePromotionInfoBarDelegate> weak_ptr_factory_;
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(KeystonePromotionInfoBarDelegate);
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// static
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void KeystonePromotionInfoBarDelegate::Create() {
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Browser* browser = chrome::GetLastActiveBrowser();
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!browser)
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  content::WebContents* webContents =
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      browser->tab_strip_model()->GetActiveWebContents();
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!webContents)
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InfoBarService* infobar_service =
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InfoBarService::FromWebContents(webContents);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  infobar_service->AddInfoBar(ConfirmInfoBarDelegate::CreateInfoBar(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<ConfirmInfoBarDelegate>(new KeystonePromotionInfoBarDelegate(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Profile::FromBrowserContext(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              webContents->GetBrowserContext())->GetPrefs()))));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeystonePromotionInfoBarDelegate::KeystonePromotionInfoBarDelegate(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefService* prefs)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ConfirmInfoBarDelegate(),
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs_(prefs),
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      can_expire_(false),
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      weak_ptr_factory_(this) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::TimeDelta kCanExpireOnNavigationAfterDelay =
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromSeconds(8);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(FROM_HERE,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&KeystonePromotionInfoBarDelegate::SetCanExpire,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()),
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kCanExpireOnNavigationAfterDelay);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeystonePromotionInfoBarDelegate::~KeystonePromotionInfoBarDelegate() {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int KeystonePromotionInfoBarDelegate::GetIconID() const {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return IDR_PRODUCT_LOGO_32;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::string16 KeystonePromotionInfoBarDelegate::GetMessageText() const {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringFUTF16(IDS_PROMOTE_INFOBAR_TEXT,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::string16 KeystonePromotionInfoBarDelegate::GetButtonLabel(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InfoBarButton button) const {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16((button == BUTTON_OK) ?
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_PROMOTE_INFOBAR_PROMOTE_BUTTON : IDS_PROMOTE_INFOBAR_DONT_ASK_BUTTON);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool KeystonePromotionInfoBarDelegate::Accept() {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  [[KeystoneGlue defaultKeystoneGlue] promoteTicket];
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool KeystonePromotionInfoBarDelegate::Cancel() {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs_->SetBoolean(prefs::kShowUpdatePromotionInfoBar, false);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool KeystonePromotionInfoBarDelegate::ShouldExpireInternal(
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const NavigationDetails& details) const {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return can_expire_;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// KeystonePromotionInfoBar ---------------------------------------------------
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)@interface KeystonePromotionInfoBar : NSObject
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)- (void)checkAndShowInfoBarForProfile:(Profile*)profile;
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)- (void)updateStatus:(NSNotification*)notification;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)- (void)removeObserver;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)@end  // @interface KeystonePromotionInfoBar
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)@implementation KeystonePromotionInfoBar
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)- (void)dealloc {
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  [self removeObserver];
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  [super dealloc];
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)- (void)checkAndShowInfoBarForProfile:(Profile*)profile {
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If this is the first run, the user clicked the "don't ask again" button
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // at some point in the past, or if the "don't ask about the default
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // browser" command-line switch is present, bail out.  That command-line
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // switch is recycled here because it's likely that the set of users that
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // don't want to be nagged about the default browser also don't want to be
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // nagged about the update check.  (Automated testers, I'm thinking of
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // you...)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandLine* commandLine = CommandLine::ForCurrentProcess();
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (first_run::IsChromeFirstRun() ||
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !profile->GetPrefs()->GetBoolean(prefs::kShowUpdatePromotionInfoBar) ||
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      commandLine->HasSwitch(switches::kNoDefaultBrowserCheck)) {
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If there is no Keystone glue (maybe because this application isn't
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keystone-enabled) or the application is on a read-only filesystem,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // doing anything related to auto-update is pointless.  Bail out.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KeystoneGlue* keystoneGlue = [KeystoneGlue defaultKeystoneGlue];
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!keystoneGlue || [keystoneGlue isOnReadOnlyFilesystem]) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stay alive as long as needed.  This is balanced by a release in
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // -updateStatus:.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  [self retain];
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutoupdateStatus recentStatus = [keystoneGlue recentStatus];
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (recentStatus == kAutoupdateNone ||
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      recentStatus == kAutoupdateRegistering) {
186d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
187d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    [center addObserver:self
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               selector:@selector(updateStatus:)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   name:kAutoupdateStatusNotification
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 object:nil];
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    [self updateStatus:[keystoneGlue recentNotification]];
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)- (void)updateStatus:(NSNotification*)notification {
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  NSDictionary* dictionary = [notification userInfo];
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutoupdateStatus status = static_cast<AutoupdateStatus>(
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      [[dictionary objectForKey:kAutoupdateStatusStatus] intValue]);
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (status == kAutoupdateNone || status == kAutoupdateRegistering) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  [self removeObserver];
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status != kAutoupdateRegisterFailed &&
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      [[KeystoneGlue defaultKeystoneGlue] needsPromotion]) {
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    KeystonePromotionInfoBarDelegate::Create();
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  [self release];
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)removeObserver {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  [[NSNotificationCenter defaultCenter] removeObserver:self];
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end  // @implementation KeystonePromotionInfoBar
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void KeystoneInfoBar::PromotionInfoBar(Profile* profile) {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeystonePromotionInfoBar* promotionInfoBar =
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      [[[KeystonePromotionInfoBar alloc] init] autorelease];
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  [promotionInfoBar checkAndShowInfoBarForProfile:profile];
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)