Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / upgrade_detector_chromeos.cc
1 // Copyright (c) 2012 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 #include "chrome/browser/chromeos/upgrade_detector_chromeos.h"
6
7 #include "base/memory/singleton.h"
8 #include "chromeos/dbus/dbus_thread_manager.h"
9
10 namespace {
11
12 // How long to wait (each cycle) before checking which severity level we should
13 // be at. Once we reach the highest severity, the timer will stop.
14 const int kNotifyCycleTimeMs = 20 * 60 * 1000;  // 20 minutes.
15
16 }  // namespace
17
18 using chromeos::DBusThreadManager;
19 using chromeos::UpdateEngineClient;
20
21 UpgradeDetectorChromeos::UpgradeDetectorChromeos() : initialized_(false) {
22 }
23
24 UpgradeDetectorChromeos::~UpgradeDetectorChromeos() {
25 }
26
27 void UpgradeDetectorChromeos::Init() {
28   DBusThreadManager::Get()->GetUpdateEngineClient()->AddObserver(this);
29   initialized_ = true;
30 }
31
32 void UpgradeDetectorChromeos::Shutdown() {
33   // Init() may not be called from tests.
34   if (!initialized_)
35     return;
36   DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this);
37 }
38
39 void UpgradeDetectorChromeos::UpdateStatusChanged(
40     const UpdateEngineClient::Status& status) {
41   if (status.status != UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT)
42     return;
43
44   upgrade_detected_time_ = base::Time::Now();
45
46   // ChromeOS shows upgrade arrow once the upgrade becomes available.
47   NotifyOnUpgrade();
48
49   // Setup timer to to move along the upgrade advisory system.
50   upgrade_notification_timer_.Start(
51       FROM_HERE, base::TimeDelta::FromMilliseconds(kNotifyCycleTimeMs),
52       this, &UpgradeDetectorChromeos::NotifyOnUpgrade);
53 }
54
55 void UpgradeDetectorChromeos::NotifyOnUpgrade() {
56   base::TimeDelta delta = base::Time::Now() - upgrade_detected_time_;
57   int64 time_passed = delta.InDays();
58
59   const int kSevereThreshold = 7;
60   const int kHighThreshold = 4;
61   const int kElevatedThreshold = 2;
62   const int kLowThreshold = 0;
63
64   // These if statements must be sorted (highest interval first).
65   if (time_passed >= kSevereThreshold) {
66     set_upgrade_notification_stage(UPGRADE_ANNOYANCE_SEVERE);
67
68     // We can't get any higher, baby.
69     upgrade_notification_timer_.Stop();
70   } else if (time_passed >= kHighThreshold) {
71     set_upgrade_notification_stage(UPGRADE_ANNOYANCE_HIGH);
72   } else if (time_passed >= kElevatedThreshold) {
73     set_upgrade_notification_stage(UPGRADE_ANNOYANCE_ELEVATED);
74   } else if (time_passed >= kLowThreshold) {
75     set_upgrade_notification_stage(UPGRADE_ANNOYANCE_LOW);
76   } else {
77     return;  // Not ready to recommend upgrade.
78   }
79
80   NotifyUpgradeRecommended();
81 }
82
83 // static
84 UpgradeDetectorChromeos* UpgradeDetectorChromeos::GetInstance() {
85   return Singleton<UpgradeDetectorChromeos>::get();
86 }
87
88 // static
89 UpgradeDetector* UpgradeDetector::GetInstance() {
90   return UpgradeDetectorChromeos::GetInstance();
91 }