version_info_updater.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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/login/version_info_updater.h" 6 7#include <vector> 8 9#include "base/bind.h" 10#include "base/bind_helpers.h" 11#include "base/chromeos/chromeos_version.h" 12#include "base/string_util.h" 13#include "base/stringprintf.h" 14#include "base/utf_string_conversions.h" 15#include "chrome/browser/browser_process.h" 16#include "chrome/browser/chromeos/settings/cros_settings.h" 17#include "chrome/browser/chromeos/settings/cros_settings_names.h" 18#include "chrome/browser/policy/browser_policy_connector.h" 19#include "chrome/common/chrome_notification_types.h" 20#include "chrome/common/chrome_version_info.h" 21#include "grit/chromium_strings.h" 22#include "grit/generated_resources.h" 23#include "grit/theme_resources.h" 24#include "ui/base/l10n/l10n_util.h" 25#include "ui/base/resource/resource_bundle.h" 26 27namespace chromeos { 28 29namespace { 30 31const char* kReportingFlags[] = { 32 chromeos::kReportDeviceVersionInfo, 33 chromeos::kReportDeviceActivityTimes, 34 chromeos::kReportDeviceBootMode, 35 chromeos::kReportDeviceLocation, 36}; 37 38} 39 40/////////////////////////////////////////////////////////////////////////////// 41// VersionInfoUpdater public: 42 43VersionInfoUpdater::VersionInfoUpdater(Delegate* delegate) 44 : enterprise_reporting_hint_(false), 45 cros_settings_(chromeos::CrosSettings::Get()), 46 delegate_(delegate) { 47} 48 49VersionInfoUpdater::~VersionInfoUpdater() { 50 for (unsigned int i = 0; i < arraysize(kReportingFlags); ++i) 51 cros_settings_->RemoveSettingsObserver(kReportingFlags[i], this); 52} 53 54void VersionInfoUpdater::StartUpdate(bool is_official_build) { 55 if (base::chromeos::IsRunningOnChromeOS()) { 56 version_loader_.GetVersion( 57 &version_consumer_, 58 base::Bind(&VersionInfoUpdater::OnVersion, base::Unretained(this)), 59 is_official_build ? 60 VersionLoader::VERSION_SHORT_WITH_DATE : 61 VersionLoader::VERSION_FULL); 62 boot_times_loader_.GetBootTimes( 63 &boot_times_consumer_, 64 base::Bind(is_official_build ? &VersionInfoUpdater::OnBootTimesNoop : 65 &VersionInfoUpdater::OnBootTimes, 66 base::Unretained(this))); 67 } else { 68 UpdateVersionLabel(); 69 } 70 71 policy::CloudPolicySubsystem* cloud_policy = 72 g_browser_process->browser_policy_connector()-> 73 device_cloud_policy_subsystem(); 74 if (cloud_policy) { 75 // Two-step reset because we want to construct new ObserverRegistrar after 76 // destruction of old ObserverRegistrar to avoid DCHECK violation because 77 // of adding existing observer. 78 cloud_policy_registrar_.reset(); 79 cloud_policy_registrar_.reset( 80 new policy::CloudPolicySubsystem::ObserverRegistrar( 81 cloud_policy, this)); 82 83 // Ensure that we have up-to-date enterprise info in case enterprise policy 84 // is already fetched and has finished initialization. 85 UpdateEnterpriseInfo(); 86 } 87 88 // Watch for changes to the reporting flags. 89 for (unsigned int i = 0; i < arraysize(kReportingFlags); ++i) 90 cros_settings_->AddSettingsObserver(kReportingFlags[i], this); 91} 92 93void VersionInfoUpdater::UpdateVersionLabel() { 94 if (version_text_.empty()) 95 return; 96 97 chrome::VersionInfo version_info; 98 std::string label_text = l10n_util::GetStringFUTF8( 99 IDS_LOGIN_VERSION_LABEL_FORMAT, 100 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME), 101 UTF8ToUTF16(version_info.Version()), 102 UTF8ToUTF16(version_text_)); 103 104 if (!enterprise_domain_text_.empty()) { 105 label_text += ' '; 106 if (enterprise_status_text_.empty()) { 107 label_text += l10n_util::GetStringFUTF8( 108 IDS_LOGIN_MANAGED_BY_LABEL_FORMAT, 109 UTF8ToUTF16(enterprise_domain_text_)); 110 } else { 111 label_text += l10n_util::GetStringFUTF8( 112 IDS_LOGIN_MANAGED_BY_WITH_STATUS_LABEL_FORMAT, 113 UTF8ToUTF16(enterprise_domain_text_), 114 UTF8ToUTF16(enterprise_status_text_)); 115 } 116 } 117 118 // Workaround over incorrect width calculation in old fonts. 119 // TODO(glotov): remove the following line when new fonts are used. 120 label_text += ' '; 121 122 if (delegate_) 123 delegate_->OnOSVersionLabelTextUpdated(label_text); 124} 125 126void VersionInfoUpdater::UpdateEnterpriseInfo() { 127 policy::BrowserPolicyConnector* policy_connector = 128 g_browser_process->browser_policy_connector(); 129 130 std::string status_text; 131 policy::CloudPolicySubsystem* cloud_policy_subsystem = 132 policy_connector->device_cloud_policy_subsystem(); 133 if (cloud_policy_subsystem) { 134 switch (cloud_policy_subsystem->state()) { 135 case policy::CloudPolicySubsystem::UNENROLLED: 136 status_text = l10n_util::GetStringUTF8( 137 IDS_LOGIN_MANAGED_BY_STATUS_PENDING); 138 break; 139 case policy::CloudPolicySubsystem::UNMANAGED: 140 case policy::CloudPolicySubsystem::BAD_GAIA_TOKEN: 141 case policy::CloudPolicySubsystem::LOCAL_ERROR: 142 status_text = l10n_util::GetStringUTF8( 143 IDS_LOGIN_MANAGED_BY_STATUS_LOST_CONNECTION); 144 break; 145 case policy::CloudPolicySubsystem::NETWORK_ERROR: 146 status_text = l10n_util::GetStringUTF8( 147 IDS_LOGIN_MANAGED_BY_STATUS_NETWORK_ERROR); 148 break; 149 case policy::CloudPolicySubsystem::TOKEN_FETCHED: 150 case policy::CloudPolicySubsystem::SUCCESS: 151 break; 152 } 153 } 154 155 bool reporting_hint = false; 156 for (unsigned int i = 0; i < arraysize(kReportingFlags); ++i) { 157 bool enabled = false; 158 if (cros_settings_->GetBoolean(kReportingFlags[i], &enabled) && enabled) { 159 reporting_hint = true; 160 break; 161 } 162 } 163 164 SetEnterpriseInfo(policy_connector->GetEnterpriseDomain(), 165 status_text, 166 reporting_hint); 167} 168 169void VersionInfoUpdater::SetEnterpriseInfo(const std::string& domain_name, 170 const std::string& status_text, 171 bool reporting_hint) { 172 if (domain_name != enterprise_domain_text_ || 173 status_text != enterprise_status_text_ || 174 reporting_hint != enterprise_reporting_hint_) { 175 enterprise_domain_text_ = domain_name; 176 enterprise_status_text_ = status_text; 177 enterprise_reporting_hint_ = reporting_hint; 178 UpdateVersionLabel(); 179 180 // Update the notification about device status reporting. 181 if (delegate_) { 182 std::string enterprise_info; 183 if (!domain_name.empty()) { 184 enterprise_info = l10n_util::GetStringFUTF8( 185 IDS_LOGIN_MANAGED_BY_NOTICE, 186 UTF8ToUTF16(enterprise_domain_text_)); 187 delegate_->OnEnterpriseInfoUpdated(enterprise_info, reporting_hint); 188 } 189 } 190 } 191} 192 193void VersionInfoUpdater::OnVersion( 194 VersionLoader::Handle handle, const std::string& version) { 195 version_text_ = version; 196 UpdateVersionLabel(); 197} 198 199void VersionInfoUpdater::OnBootTimesNoop( 200 BootTimesLoader::Handle handle, BootTimesLoader::BootTimes boot_times) { 201} 202 203void VersionInfoUpdater::OnBootTimes( 204 BootTimesLoader::Handle handle, BootTimesLoader::BootTimes boot_times) { 205 const char* kBootTimesNoChromeExec = 206 "Non-firmware boot took %.2f seconds (kernel %.2fs, system %.2fs)"; 207 const char* kBootTimesChromeExec = 208 "Non-firmware boot took %.2f seconds " 209 "(kernel %.2fs, system %.2fs, chrome %.2fs)"; 210 std::string boot_times_text; 211 212 if (boot_times.chrome > 0) { 213 boot_times_text = 214 base::StringPrintf( 215 kBootTimesChromeExec, 216 boot_times.total, 217 boot_times.pre_startup, 218 boot_times.system, 219 boot_times.chrome); 220 } else { 221 boot_times_text = 222 base::StringPrintf( 223 kBootTimesNoChromeExec, 224 boot_times.total, 225 boot_times.pre_startup, 226 boot_times.system); 227 } 228 // Use UTF8ToWide once this string is localized. 229 if (delegate_) 230 delegate_->OnBootTimesLabelTextUpdated(boot_times_text); 231} 232 233void VersionInfoUpdater::OnPolicyStateChanged( 234 policy::CloudPolicySubsystem::PolicySubsystemState state, 235 policy::CloudPolicySubsystem::ErrorDetails error_details) { 236 UpdateEnterpriseInfo(); 237} 238 239void VersionInfoUpdater::Observe( 240 int type, 241 const content::NotificationSource& source, 242 const content::NotificationDetails& details) { 243 if (type == chrome::NOTIFICATION_SYSTEM_SETTING_CHANGED) 244 UpdateEnterpriseInfo(); 245 else 246 NOTREACHED(); 247} 248 249} // namespace chromeos 250