Home | History | Annotate | Download | only in login
      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