diff options
author | finnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-13 13:43:44 +0000 |
---|---|---|
committer | finnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-13 13:43:44 +0000 |
commit | f1c76b9f91496b804665eb88635307402a3381a5 (patch) | |
tree | 618b4b10b81921651afb6a54424ba9435075e3c9 /chrome/browser/upgrade_detector.cc | |
parent | 42febbb6888dc065ac20521ed9ec65307baa56ed (diff) | |
download | chromium_src-f1c76b9f91496b804665eb88635307402a3381a5.zip chromium_src-f1c76b9f91496b804665eb88635307402a3381a5.tar.gz chromium_src-f1c76b9f91496b804665eb88635307402a3381a5.tar.bz2 |
When critical updates have been installed and the user has been idle for quite some time, show a bubble anchored to the wrench menu with a countdown clock for auto-restarting.
BUG=97665
TEST=The testing for this is a bit too long-windy to describe here. Contact me for details.
Review URL: http://codereview.chromium.org/8142028
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@105298 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/upgrade_detector.cc')
-rw-r--r-- | chrome/browser/upgrade_detector.cc | 76 |
1 files changed, 75 insertions, 1 deletions
diff --git a/chrome/browser/upgrade_detector.cc b/chrome/browser/upgrade_detector.cc index f4a7e68..eb6dfa5 100644 --- a/chrome/browser/upgrade_detector.cc +++ b/chrome/browser/upgrade_detector.cc @@ -4,12 +4,32 @@ #include "chrome/browser/upgrade_detector.h" +#include "base/bind.h" +#include "base/command_line.h" #include "chrome/browser/prefs/pref_service.h" +#include "chrome/browser/ui/browser_list.h" #include "chrome/common/chrome_notification_types.h" +#include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" #include "content/common/notification_service.h" #include "grit/theme_resources.h" +// How long to wait between checks for whether the user has been idle. +static const int kIdleRepeatingTimerWait = 10; // Minutes (seconds if testing). + +// How much idle time (since last input even was detected) must have passed +// until we notify that a critical update has occurred. +static const int kIdleAmount = 2; // Hours (or seconds, if testing). + +bool UseTestingIntervals() { + // If a command line parameter specifying how long the upgrade check should + // be, we assume it is for testing and switch to using seconds instead of + // hours. + const CommandLine& cmd_line = *CommandLine::ForCurrentProcess(); + return !cmd_line.GetSwitchValueASCII( + switches::kCheckForUpdateIntervalSec).empty(); +} + // static void UpgradeDetector::RegisterPrefs(PrefService* prefs) { prefs->RegisterBooleanPref(prefs::kRestartLastSessionOnShutdown, false); @@ -18,6 +38,13 @@ void UpgradeDetector::RegisterPrefs(PrefService* prefs) { int UpgradeDetector::GetIconResourceID(UpgradeNotificationIconType type) { bool badge = type == UPGRADE_ICON_TYPE_BADGE; switch (upgrade_notification_stage_) { + case UPGRADE_ANNOYANCE_CRITICAL: + // The critical annoyance state, somewhat ironically, re-purposes the + // icon for the second highest severity state, since that state has the + // icon most closely resembling the one requested of this feature and the + // critical annoyance is never part of the sliding scale of severity + // anyway (always shown on its own). + return badge ? IDR_UPDATE_BADGE3 : IDR_UPDATE_MENU3; case UPGRADE_ANNOYANCE_SEVERE: return badge ? IDR_UPDATE_BADGE4 : IDR_UPDATE_MENU4; case UPGRADE_ANNOYANCE_HIGH: @@ -32,7 +59,9 @@ int UpgradeDetector::GetIconResourceID(UpgradeNotificationIconType type) { } UpgradeDetector::UpgradeDetector() - : upgrade_notification_stage_(UPGRADE_ANNOYANCE_NONE), + : is_critical_upgrade_(false), + critical_update_acknowledged_(false), + upgrade_notification_stage_(UPGRADE_ANNOYANCE_NONE), notify_upgrade_(false) { } @@ -41,6 +70,7 @@ UpgradeDetector::~UpgradeDetector() { void UpgradeDetector::NotifyUpgradeDetected() { upgrade_detected_time_ = base::Time::Now(); + critical_update_acknowledged_ = false; } void UpgradeDetector::NotifyUpgradeRecommended() { @@ -50,4 +80,48 @@ void UpgradeDetector::NotifyUpgradeRecommended() { chrome::NOTIFICATION_UPGRADE_RECOMMENDED, Source<UpgradeDetector>(this), NotificationService::NoDetails()); + + if (is_critical_upgrade_) { + int idle_timer = UseTestingIntervals() ? + kIdleRepeatingTimerWait : + kIdleRepeatingTimerWait * 60; // To minutes. + idle_check_timer_.Start(FROM_HERE, + base::TimeDelta::FromSeconds(idle_timer), + this, &UpgradeDetector::CheckIdle); + } +} + +void UpgradeDetector::CheckIdle() { + // CalculateIdleState expects an interval in seconds. + int idle_time_allowed = UseTestingIntervals() ? kIdleAmount : + kIdleAmount * 60 * 60; + + CalculateIdleState( + idle_time_allowed, base::Bind(&UpgradeDetector::IdleCallback, + base::Unretained(this))); +} + +void UpgradeDetector::IdleCallback(IdleState state) { + switch (state) { + case IDLE_STATE_LOCKED: + // Computer is locked, auto-restart. + idle_check_timer_.Stop(); + BrowserList::AttemptRestart(); + break; + case IDLE_STATE_IDLE: + // Computer has been idle for long enough, show warning. + idle_check_timer_.Stop(); + NotificationService::current()->Notify( + chrome::NOTIFICATION_CRITICAL_UPGRADE_INSTALLED, + Source<UpgradeDetector>(this), + NotificationService::NoDetails()); + break; + case IDLE_STATE_ACTIVE: + case IDLE_STATE_UNKNOWN: + break; + default: + NOTREACHED(); // Need to add any new value above (either providing + // automatic restart or show notification to user). + break; + } } |