Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_UPGRADE_DETECTOR_H_
      6 #define CHROME_BROWSER_UPGRADE_DETECTOR_H_
      7 
      8 #include "base/timer/timer.h"
      9 #include "chrome/browser/idle.h"
     10 #include "ui/gfx/image/image.h"
     11 
     12 class PrefRegistrySimple;
     13 
     14 ///////////////////////////////////////////////////////////////////////////////
     15 // UpgradeDetector
     16 //
     17 // This class is a singleton class that monitors when an upgrade happens in the
     18 // background. We basically ask Omaha what it thinks the latest version is and
     19 // if our version is lower we send out a notification upon:
     20 //   a) Detecting an upgrade and...
     21 //   b) When we think the user should be notified about the upgrade.
     22 // The latter happens much later, since we don't want to be too annoying.
     23 //
     24 class UpgradeDetector {
     25  public:
     26   // The Homeland Security Upgrade Advisory System.
     27   enum UpgradeNotificationAnnoyanceLevel {
     28     UPGRADE_ANNOYANCE_NONE = 0,  // What? Me worry?
     29     UPGRADE_ANNOYANCE_LOW,       // Green.
     30     UPGRADE_ANNOYANCE_ELEVATED,  // Yellow.
     31     UPGRADE_ANNOYANCE_HIGH,      // Red.
     32     UPGRADE_ANNOYANCE_SEVERE,    // Orange.
     33     UPGRADE_ANNOYANCE_CRITICAL,  // Red exclamation mark.
     34   };
     35 
     36   // The two types of icons we know about.
     37   enum UpgradeNotificationIconType {
     38     UPGRADE_ICON_TYPE_BADGE = 0,  // For overlay badging of the wrench menu.
     39     UPGRADE_ICON_TYPE_MENU_ICON,  // For showing in the wrench menu.
     40   };
     41 
     42   // Returns the singleton implementation instance.
     43   static UpgradeDetector* GetInstance();
     44 
     45   virtual ~UpgradeDetector();
     46 
     47   static void RegisterPrefs(PrefRegistrySimple* registry);
     48 
     49   // Whether the user should be notified about an upgrade.
     50   bool notify_upgrade() const { return notify_upgrade_; }
     51 
     52   // Whether the upgrade recommendation is due to Chrome being outdated.
     53   bool is_outdated_install() const {
     54     return upgrade_available_ == UPGRADE_NEEDED_OUTDATED_INSTALL;
     55   }
     56 
     57   // Notifify this object that the user has acknowledged the critical update
     58   // so we don't need to complain about it for now.
     59   void acknowledge_critical_update() {
     60     critical_update_acknowledged_ = true;
     61   }
     62 
     63   // Whether the user has acknowledged the critical update.
     64   bool critical_update_acknowledged() const {
     65     return critical_update_acknowledged_;
     66   }
     67 
     68   // When the last upgrade was detected.
     69   const base::Time& upgrade_detected_time() const {
     70     return upgrade_detected_time_;
     71   }
     72 
     73   // Retrieves the right icon ID based on the degree of severity (see
     74   // UpgradeNotificationAnnoyanceLevel, each level has an an accompanying icon
     75   // to go with it). |type| determines which class of icons the caller wants,
     76   // either an icon appropriate for badging the wrench menu or one to display
     77   // within the wrench menu.
     78   int GetIconResourceID(UpgradeNotificationIconType type);
     79 
     80   UpgradeNotificationAnnoyanceLevel upgrade_notification_stage() const {
     81     return upgrade_notification_stage_;
     82   }
     83 
     84  protected:
     85   UpgradeDetector();
     86 
     87   // Sends out UPGRADE_DETECTED notification and record upgrade_detected_time_.
     88   void NotifyUpgradeDetected();
     89 
     90   // Sends out UPGRADE_RECOMMENDED notification and set notify_upgrade_.
     91   void NotifyUpgradeRecommended();
     92 
     93   void set_upgrade_notification_stage(UpgradeNotificationAnnoyanceLevel stage) {
     94     upgrade_notification_stage_ = stage;
     95   }
     96 
     97   enum UpgradeAvailable {
     98     // If no update is available and current install is recent enough.
     99     UPGRADE_AVAILABLE_NONE,
    100     // If a regular update is available.
    101     UPGRADE_AVAILABLE_REGULAR,
    102     // If a critical update to Chrome has been installed, such as a zero-day
    103     // fix.
    104     UPGRADE_AVAILABLE_CRITICAL,
    105     // If no update to Chrome has been installed for more than the recommended
    106     // time.
    107     UPGRADE_NEEDED_OUTDATED_INSTALL,
    108   } upgrade_available_;
    109 
    110   // Whether the user has acknowledged the critical update.
    111   bool critical_update_acknowledged_;
    112 
    113  private:
    114   // Initiates an Idle check. See IdleCallback below.
    115   void CheckIdle();
    116 
    117   // The callback for the IdleCheck. Tells us whether Chrome has received any
    118   // input events since the specified time.
    119   void IdleCallback(IdleState state);
    120 
    121   // When the upgrade was detected.
    122   base::Time upgrade_detected_time_;
    123 
    124   // A timer to check to see if we've been idle for long enough to show the
    125   // critical warning. Should only be set if |upgrade_available_| is
    126   // UPGRADE_AVAILABLE_CRITICAL.
    127   base::RepeatingTimer<UpgradeDetector> idle_check_timer_;
    128 
    129   // The stage at which the annoyance level for upgrade notifications is at.
    130   UpgradeNotificationAnnoyanceLevel upgrade_notification_stage_;
    131 
    132   // Whether we have waited long enough after detecting an upgrade (to see
    133   // is we should start nagging about upgrading).
    134   bool notify_upgrade_;
    135 
    136   DISALLOW_COPY_AND_ASSIGN(UpgradeDetector);
    137 };
    138 
    139 #endif  // CHROME_BROWSER_UPGRADE_DETECTOR_H_
    140