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
|
// 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.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.
};
// The two types of icons we know about.
enum UpgradeNotificationIconType {
UPGRADE_ICON_TYPE_BADGE = 0, // For overlay badging of the wrench menu.
UPGRADE_ICON_TYPE_MENU_ICON, // For showing in the wrench menu.
};
// 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;
}
// 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_;
}
// When the last upgrade was detected.
const base::Time& upgrade_detected_time() const {
return upgrade_detected_time_;
}
// Retrieves the right icon ID based on the degree of severity (see
// UpgradeNotificationAnnoyanceLevel, each level has an an accompanying icon
// to go with it). |type| determines which class of icons the caller wants,
// either an icon appropriate for badging the wrench menu or one to display
// within the wrench menu.
int GetIconResourceID(UpgradeNotificationIconType type);
UpgradeNotificationAnnoyanceLevel upgrade_notification_stage() const {
return upgrade_notification_stage_;
}
protected:
UpgradeDetector();
// Sends out UPGRADE_DETECTED notification and record upgrade_detected_time_.
void NotifyUpgradeDetected();
// Sends out UPGRADE_RECOMMENDED notification and set notify_upgrade_.
void NotifyUpgradeRecommended();
void set_upgrade_notification_stage(UpgradeNotificationAnnoyanceLevel stage) {
upgrade_notification_stage_ = stage;
}
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,
} upgrade_available_;
// Whether the user has acknowledged the critical update.
bool critical_update_acknowledged_;
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);
// When the upgrade was detected.
base::Time upgrade_detected_time_;
// 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_
|