OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 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/ui/toolbar/wrench_menu_badge_controller.h" |
| 6 |
| 7 #include "base/logging.h" |
| 8 #include "chrome/browser/chrome_notification_types.h" |
| 9 #include "chrome/browser/ui/global_error/global_error_service.h" |
| 10 #include "chrome/browser/ui/global_error/global_error_service_factory.h" |
| 11 #include "chrome/browser/upgrade_detector.h" |
| 12 |
| 13 #if defined(OS_WIN) |
| 14 #include "base/win/windows_version.h" |
| 15 #include "chrome/browser/enumerate_modules_model_win.h" |
| 16 #endif |
| 17 |
| 18 namespace { |
| 19 |
| 20 // Maps an upgrade level to a severity level. |
| 21 WrenchIconPainter::Severity SeverityFromUpgradeLevel( |
| 22 UpgradeDetector::UpgradeNotificationAnnoyanceLevel level) { |
| 23 switch (level) { |
| 24 case UpgradeDetector::UPGRADE_ANNOYANCE_NONE: |
| 25 return WrenchIconPainter::SEVERITY_NONE; |
| 26 case UpgradeDetector::UPGRADE_ANNOYANCE_LOW: |
| 27 return WrenchIconPainter::SEVERITY_LOW; |
| 28 case UpgradeDetector::UPGRADE_ANNOYANCE_ELEVATED: |
| 29 return WrenchIconPainter::SEVERITY_MEDIUM; |
| 30 case UpgradeDetector::UPGRADE_ANNOYANCE_HIGH: |
| 31 return WrenchIconPainter::SEVERITY_HIGH; |
| 32 case UpgradeDetector::UPGRADE_ANNOYANCE_SEVERE: |
| 33 return WrenchIconPainter::SEVERITY_HIGH; |
| 34 case UpgradeDetector::UPGRADE_ANNOYANCE_CRITICAL: |
| 35 return WrenchIconPainter::SEVERITY_HIGH; |
| 36 } |
| 37 NOTREACHED(); |
| 38 return WrenchIconPainter::SEVERITY_NONE; |
| 39 } |
| 40 |
| 41 // Checks if the wrench icon should be animated for the given upgrade level. |
| 42 bool ShouldAnimateUpgradeLevel( |
| 43 UpgradeDetector::UpgradeNotificationAnnoyanceLevel level) { |
| 44 bool should_animate = true; |
| 45 if (level == UpgradeDetector::UPGRADE_ANNOYANCE_LOW) { |
| 46 // Only animate low severity upgrades once. |
| 47 static bool should_animate_low_severity = true; |
| 48 should_animate = should_animate_low_severity; |
| 49 should_animate_low_severity = false; |
| 50 } |
| 51 return should_animate; |
| 52 } |
| 53 |
| 54 // Returns true if we should show the upgrade recommended badge. |
| 55 bool ShouldShowUpgradeRecommended() { |
| 56 #if defined(OS_CHROMEOS) |
| 57 // In chromeos, the update recommendation is shown in the system tray. So it |
| 58 // should not be displayed in the wrench menu. |
| 59 return false; |
| 60 #else |
| 61 return UpgradeDetector::GetInstance()->notify_upgrade(); |
| 62 #endif |
| 63 } |
| 64 |
| 65 // Returns true if we should show the warning for incompatible software. |
| 66 bool ShouldShowIncompatibilityWarning() { |
| 67 #if defined(OS_WIN) |
| 68 EnumerateModulesModel* loaded_modules = EnumerateModulesModel::GetInstance(); |
| 69 loaded_modules->MaybePostScanningTask(); |
| 70 return loaded_modules->ShouldShowConflictWarning(); |
| 71 #else |
| 72 return false; |
| 73 #endif |
| 74 } |
| 75 |
| 76 } // namespace |
| 77 |
| 78 WrenchMenuBadgeController::WrenchMenuBadgeController(Profile* profile, |
| 79 Delegate* delegate) |
| 80 : profile_(profile), delegate_(delegate) { |
| 81 DCHECK(profile_); |
| 82 DCHECK(delegate_); |
| 83 |
| 84 registrar_.Add(this, chrome::NOTIFICATION_UPGRADE_RECOMMENDED, |
| 85 content::NotificationService::AllSources()); |
| 86 registrar_.Add(this, chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED, |
| 87 content::Source<Profile>(profile_)); |
| 88 |
| 89 #if defined(OS_WIN) |
| 90 if (base::win::GetVersion() == base::win::VERSION_XP) { |
| 91 registrar_.Add(this, chrome::NOTIFICATION_MODULE_LIST_ENUMERATED, |
| 92 content::NotificationService::AllSources()); |
| 93 } |
| 94 registrar_.Add(this, chrome::NOTIFICATION_MODULE_INCOMPATIBILITY_BADGE_CHANGE, |
| 95 content::NotificationService::AllSources()); |
| 96 #endif |
| 97 } |
| 98 |
| 99 WrenchMenuBadgeController::~WrenchMenuBadgeController() { |
| 100 } |
| 101 |
| 102 void WrenchMenuBadgeController::UpdateDelegate() { |
| 103 if (ShouldShowUpgradeRecommended()) { |
| 104 UpgradeDetector::UpgradeNotificationAnnoyanceLevel level = |
| 105 UpgradeDetector::GetInstance()->upgrade_notification_stage(); |
| 106 delegate_->UpdateBadgeSeverity(BADGE_TYPE_UPGRADE_NOTIFICATION, |
| 107 SeverityFromUpgradeLevel(level), |
| 108 ShouldAnimateUpgradeLevel(level)); |
| 109 return; |
| 110 } |
| 111 |
| 112 if (ShouldShowIncompatibilityWarning()) { |
| 113 delegate_->UpdateBadgeSeverity(BADGE_TYPE_INCOMPATIBILITY_WARNING, |
| 114 WrenchIconPainter::SEVERITY_MEDIUM, true); |
| 115 return; |
| 116 } |
| 117 |
| 118 if (GlobalErrorServiceFactory::GetForProfile(profile_)-> |
| 119 GetHighestSeverityGlobalErrorWithWrenchMenuItem()) { |
| 120 // If you change the severity here, make sure to also change the menu icon |
| 121 // and the bubble icon. |
| 122 delegate_->UpdateBadgeSeverity(BADGE_TYPE_GLOBAL_ERROR, |
| 123 WrenchIconPainter::SEVERITY_MEDIUM, true); |
| 124 return; |
| 125 } |
| 126 |
| 127 delegate_->UpdateBadgeSeverity(BADGE_TYPE_NONE, |
| 128 WrenchIconPainter::SEVERITY_NONE, true); |
| 129 } |
| 130 |
| 131 void WrenchMenuBadgeController::Observe( |
| 132 int type, |
| 133 const content::NotificationSource& source, |
| 134 const content::NotificationDetails& details) { |
| 135 UpdateDelegate(); |
| 136 } |
OLD | NEW |