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)