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/strings/string_util.h" 12 #include "base/strings/stringprintf.h" 13 #include "base/strings/utf_string_conversions.h" 14 #include "base/sys_info.h" 15 #include "chrome/browser/browser_process.h" 16 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" 17 #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" 18 #include "chrome/browser/chromeos/settings/cros_settings.h" 19 #include "chrome/common/chrome_version_info.h" 20 #include "chromeos/settings/cros_settings_names.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 27 namespace chromeos { 28 29 namespace { 30 31 const char* kReportingFlags[] = { 32 chromeos::kReportDeviceVersionInfo, 33 chromeos::kReportDeviceActivityTimes, 34 chromeos::kReportDeviceBootMode, 35 chromeos::kReportDeviceLocation, 36 }; 37 38 } 39 40 /////////////////////////////////////////////////////////////////////////////// 41 // VersionInfoUpdater public: 42 43 VersionInfoUpdater::VersionInfoUpdater(Delegate* delegate) 44 : cros_settings_(chromeos::CrosSettings::Get()), 45 delegate_(delegate), 46 weak_pointer_factory_(this) { 47 } 48 49 VersionInfoUpdater::~VersionInfoUpdater() { 50 policy::BrowserPolicyConnectorChromeOS* connector = 51 g_browser_process->platform_part()->browser_policy_connector_chromeos(); 52 policy::DeviceCloudPolicyManagerChromeOS* policy_manager = 53 connector->GetDeviceCloudPolicyManager(); 54 if (policy_manager) 55 policy_manager->core()->store()->RemoveObserver(this); 56 } 57 58 void VersionInfoUpdater::StartUpdate(bool is_official_build) { 59 if (base::SysInfo::IsRunningOnChromeOS()) { 60 version_loader_.GetVersion( 61 is_official_build ? VersionLoader::VERSION_SHORT_WITH_DATE 62 : VersionLoader::VERSION_FULL, 63 base::Bind(&VersionInfoUpdater::OnVersion, 64 weak_pointer_factory_.GetWeakPtr()), 65 &tracker_); 66 } else { 67 UpdateVersionLabel(); 68 } 69 70 policy::BrowserPolicyConnectorChromeOS* connector = 71 g_browser_process->platform_part()->browser_policy_connector_chromeos(); 72 policy::DeviceCloudPolicyManagerChromeOS* policy_manager = 73 connector->GetDeviceCloudPolicyManager(); 74 if (policy_manager) { 75 policy_manager->core()->store()->AddObserver(this); 76 77 // Ensure that we have up-to-date enterprise info in case enterprise policy 78 // is already fetched and has finished initialization. 79 UpdateEnterpriseInfo(); 80 } 81 82 // Watch for changes to the reporting flags. 83 base::Closure callback = 84 base::Bind(&VersionInfoUpdater::UpdateEnterpriseInfo, 85 base::Unretained(this)); 86 for (unsigned int i = 0; i < arraysize(kReportingFlags); ++i) { 87 subscriptions_.push_back( 88 cros_settings_->AddSettingsObserver(kReportingFlags[i], 89 callback).release()); 90 } 91 } 92 93 void 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 base::UTF8ToUTF16(version_info.Version()), 102 base::UTF8ToUTF16(version_text_)); 103 104 // Workaround over incorrect width calculation in old fonts. 105 // TODO(glotov): remove the following line when new fonts are used. 106 label_text += ' '; 107 108 if (delegate_) 109 delegate_->OnOSVersionLabelTextUpdated(label_text); 110 } 111 112 void VersionInfoUpdater::UpdateEnterpriseInfo() { 113 policy::BrowserPolicyConnectorChromeOS* connector = 114 g_browser_process->platform_part()->browser_policy_connector_chromeos(); 115 SetEnterpriseInfo(connector->GetEnterpriseDomain()); 116 } 117 118 void VersionInfoUpdater::SetEnterpriseInfo(const std::string& domain_name) { 119 // Update the notification about device status reporting. 120 if (delegate_ && !domain_name.empty()) { 121 std::string enterprise_info; 122 enterprise_info = l10n_util::GetStringFUTF8( 123 IDS_DEVICE_OWNED_BY_NOTICE, 124 base::UTF8ToUTF16(domain_name)); 125 delegate_->OnEnterpriseInfoUpdated(enterprise_info); 126 } 127 } 128 129 void VersionInfoUpdater::OnVersion(const std::string& version) { 130 version_text_ = version; 131 UpdateVersionLabel(); 132 } 133 134 void VersionInfoUpdater::OnStoreLoaded(policy::CloudPolicyStore* store) { 135 UpdateEnterpriseInfo(); 136 } 137 138 void VersionInfoUpdater::OnStoreError(policy::CloudPolicyStore* store) { 139 UpdateEnterpriseInfo(); 140 } 141 142 } // namespace chromeos 143