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