// Copyright (c) 2012 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. #include "chrome/browser/chromeos/upgrade_detector_chromeos.h" #include "base/memory/singleton.h" #include "chromeos/dbus/dbus_thread_manager.h" namespace { // How long to wait (each cycle) before checking which severity level we should // be at. Once we reach the highest severity, the timer will stop. const int kNotifyCycleTimeMs = 20 * 60 * 1000; // 20 minutes. } // namespace using chromeos::DBusThreadManager; using chromeos::UpdateEngineClient; UpgradeDetectorChromeos::UpgradeDetectorChromeos() : initialized_(false) { } UpgradeDetectorChromeos::~UpgradeDetectorChromeos() { } void UpgradeDetectorChromeos::Init() { DBusThreadManager::Get()->GetUpdateEngineClient()->AddObserver(this); initialized_ = true; } void UpgradeDetectorChromeos::Shutdown() { // Init() may not be called from tests. if (!initialized_) return; DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this); } void UpgradeDetectorChromeos::UpdateStatusChanged( const UpdateEngineClient::Status& status) { if (status.status != UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT) return; NotifyUpgradeDetected(); // ChromeOS shows upgrade arrow once the upgrade becomes available. NotifyOnUpgrade(); // Setup timer to to move along the upgrade advisory system. upgrade_notification_timer_.Start( FROM_HERE, base::TimeDelta::FromMilliseconds(kNotifyCycleTimeMs), this, &UpgradeDetectorChromeos::NotifyOnUpgrade); } void UpgradeDetectorChromeos::NotifyOnUpgrade() { base::TimeDelta delta = base::Time::Now() - upgrade_detected_time(); int64 time_passed = delta.InDays(); const int kSevereThreshold = 7; const int kHighThreshold = 4; const int kElevatedThreshold = 2; const int kLowThreshold = 0; // These if statements must be sorted (highest interval first). if (time_passed >= kSevereThreshold) { set_upgrade_notification_stage(UPGRADE_ANNOYANCE_SEVERE); // We can't get any higher, baby. upgrade_notification_timer_.Stop(); } else if (time_passed >= kHighThreshold) { set_upgrade_notification_stage(UPGRADE_ANNOYANCE_HIGH); } else if (time_passed >= kElevatedThreshold) { set_upgrade_notification_stage(UPGRADE_ANNOYANCE_ELEVATED); } else if (time_passed >= kLowThreshold) { set_upgrade_notification_stage(UPGRADE_ANNOYANCE_LOW); } else { return; // Not ready to recommend upgrade. } NotifyUpgradeRecommended(); } // static UpgradeDetectorChromeos* UpgradeDetectorChromeos::GetInstance() { return Singleton::get(); } // static UpgradeDetector* UpgradeDetector::GetInstance() { return UpgradeDetectorChromeos::GetInstance(); }