1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
|
// 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.
#ifndef CHROME_BROWSER_UPGRADE_DETECTOR_H_
#define CHROME_BROWSER_UPGRADE_DETECTOR_H_
#include "base/timer/timer.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/idle.h"
#include "ui/gfx/image/image.h"
class PrefRegistrySimple;
///////////////////////////////////////////////////////////////////////////////
// UpgradeDetector
//
// This class is a singleton class that monitors when an upgrade happens in the
// background. We basically ask Omaha what it thinks the latest version is and
// if our version is lower we send out a notification upon:
// a) Detecting an upgrade and...
// b) When we think the user should be notified about the upgrade.
// The latter happens much later, since we don't want to be too annoying.
//
class UpgradeDetector {
public:
// The Homeland Security Upgrade Advisory System.
enum UpgradeNotificationAnnoyanceLevel {
UPGRADE_ANNOYANCE_NONE = 0, // What? Me worry?
UPGRADE_ANNOYANCE_LOW, // Green.
UPGRADE_ANNOYANCE_ELEVATED, // Yellow.
UPGRADE_ANNOYANCE_HIGH, // Red.
UPGRADE_ANNOYANCE_SEVERE, // Orange.
UPGRADE_ANNOYANCE_CRITICAL, // Red exclamation mark.
};
// Returns the singleton implementation instance.
static UpgradeDetector* GetInstance();
virtual ~UpgradeDetector();
static void RegisterPrefs(PrefRegistrySimple* registry);
// Whether the user should be notified about an upgrade.
bool notify_upgrade() const { return notify_upgrade_; }
// Whether the upgrade recommendation is due to Chrome being outdated.
bool is_outdated_install() const {
return upgrade_available_ == UPGRADE_NEEDED_OUTDATED_INSTALL;
}
// Whether the upgrade recommendation is due to Chrome being outdated AND
// auto-update is turned off.
bool is_outdated_install_no_au() const {
return upgrade_available_ == UPGRADE_NEEDED_OUTDATED_INSTALL_NO_AU;
}
// Notifify this object that the user has acknowledged the critical update
// so we don't need to complain about it for now.
void acknowledge_critical_update() {
critical_update_acknowledged_ = true;
}
// Whether the user has acknowledged the critical update.
bool critical_update_acknowledged() const {
return critical_update_acknowledged_;
}
bool is_factory_reset_required() const { return is_factory_reset_required_; }
// Retrieves the right icon ID based on the degree of severity (see
// UpgradeNotificationAnnoyanceLevel, each level has an an accompanying icon
// to go with it) to display within the wrench menu.
int GetIconResourceID();
UpgradeNotificationAnnoyanceLevel upgrade_notification_stage() const {
return upgrade_notification_stage_;
}
protected:
enum UpgradeAvailable {
// If no update is available and current install is recent enough.
UPGRADE_AVAILABLE_NONE,
// If a regular update is available.
UPGRADE_AVAILABLE_REGULAR,
// If a critical update to Chrome has been installed, such as a zero-day
// fix.
UPGRADE_AVAILABLE_CRITICAL,
// If no update to Chrome has been installed for more than the recommended
// time.
UPGRADE_NEEDED_OUTDATED_INSTALL,
// If no update to Chrome has been installed for more than the recommended
// time AND auto-update is turned off.
UPGRADE_NEEDED_OUTDATED_INSTALL_NO_AU,
};
UpgradeDetector();
// Sends out UPGRADE_RECOMMENDED notification and set notify_upgrade_.
void NotifyUpgradeRecommended();
// Triggers a critical update, which starts a timer that checks the machine
// idle state. Protected and virtual so that it could be overridden by tests.
virtual void TriggerCriticalUpdate();
UpgradeAvailable upgrade_available() const { return upgrade_available_; }
void set_upgrade_available(UpgradeAvailable available) {
upgrade_available_ = available;
}
void set_best_effort_experiment_updates_available(bool available) {
best_effort_experiment_updates_available_ = available;
}
bool critical_experiment_updates_available() const {
return critical_experiment_updates_available_;
}
void set_critical_experiment_updates_available(bool available) {
critical_experiment_updates_available_ = available;
}
void set_critical_update_acknowledged(bool acknowledged) {
critical_update_acknowledged_ = acknowledged;
}
void set_upgrade_notification_stage(UpgradeNotificationAnnoyanceLevel stage) {
upgrade_notification_stage_ = stage;
}
void set_is_factory_reset_required(bool is_factory_reset_required) {
is_factory_reset_required_ = is_factory_reset_required;
}
private:
// Initiates an Idle check. See IdleCallback below.
void CheckIdle();
// The callback for the IdleCheck. Tells us whether Chrome has received any
// input events since the specified time.
void IdleCallback(IdleState state);
// Triggers a global notification of the specified |type|.
void TriggerNotification(chrome::NotificationType type);
// Whether any software updates are available (experiment updates are tracked
// separately via additional member variables below).
UpgradeAvailable upgrade_available_;
// Whether "best effort" experiment updates are available.
bool best_effort_experiment_updates_available_;
// Whether "critical" experiment updates are available.
bool critical_experiment_updates_available_;
// Whether the user has acknowledged the critical update.
bool critical_update_acknowledged_;
// Whether a factory reset is needed to complete an update.
bool is_factory_reset_required_;
// A timer to check to see if we've been idle for long enough to show the
// critical warning. Should only be set if |upgrade_available_| is
// UPGRADE_AVAILABLE_CRITICAL.
base::RepeatingTimer<UpgradeDetector> idle_check_timer_;
// The stage at which the annoyance level for upgrade notifications is at.
UpgradeNotificationAnnoyanceLevel upgrade_notification_stage_;
// Whether we have waited long enough after detecting an upgrade (to see
// is we should start nagging about upgrading).
bool notify_upgrade_;
DISALLOW_COPY_AND_ASSIGN(UpgradeDetector);
};
#endif // CHROME_BROWSER_UPGRADE_DETECTOR_H_
|