version_updater_chromeos.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
151125a21eafc29c925cac3655b46cfd8ef55f764Ted Kremenek// Copyright (c) 2012 The Chromium Authors. All rights reserved. 24241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek// Use of this source code is governed by a BSD-style license that can be 34241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek// found in the LICENSE file. 44241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek 54241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "chrome/browser/ui/webui/help/version_updater_chromeos.h" 64241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek 74241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include <cmath> 84241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek 94241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "base/bind.h" 1051125a21eafc29c925cac3655b46cfd8ef55f764Ted Kremenek#include "base/bind_helpers.h" 1151125a21eafc29c925cac3655b46cfd8ef55f764Ted Kremenek#include "chrome/browser/chromeos/login/startup_utils.h" 12b2213dc3dd8f58b611b91d2fce4834a767efcba7Jeffrey Yasskin#include "chrome/browser/chromeos/login/user_manager.h" 13b2213dc3dd8f58b611b91d2fce4834a767efcba7Jeffrey Yasskin#include "chrome/browser/chromeos/login/wizard_controller.h" 14b2213dc3dd8f58b611b91d2fce4834a767efcba7Jeffrey Yasskin#include "chrome/browser/chromeos/settings/cros_settings.h" 15b2213dc3dd8f58b611b91d2fce4834a767efcba7Jeffrey Yasskin#include "chrome/browser/chromeos/settings/cros_settings_names.h" 164241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "chromeos/dbus/dbus_thread_manager.h" 174241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "chromeos/dbus/power_manager_client.h" 184241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek#include "grit/generated_resources.h" 195a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#include "ui/base/l10n/l10n_util.h" 205a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 214241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenekusing chromeos::CrosSettings; 2263bbe5312cd89ce0ceb684bff68c5baef636e93cTed Kremenekusing chromeos::DBusThreadManager; 2330a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruthusing chromeos::UpdateEngineClient; 2430a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruthusing chromeos::UserManager; 2530a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruthusing chromeos::WizardController; 2630a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth 2730a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler CarruthVersionUpdater* VersionUpdater::Create() { 284241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek return new VersionUpdaterCros; 2930a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth} 30f6f5ef4aaa66b60270e84d1fe1292886369d2f38Ted Kremenek 3130a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruthvoid VersionUpdaterCros::CheckForUpdate(const StatusCallback& callback) { 324241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek callback_ = callback; 3363bbe5312cd89ce0ceb684bff68c5baef636e93cTed Kremenek 34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines UpdateEngineClient* update_engine_client = 35626719bd2c09e27fe7c182724a812d27f59e3819Ted Kremenek DBusThreadManager::Get()->GetUpdateEngineClient(); 364241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek update_engine_client->AddObserver(this); 374241b3d1ad87e9a593bbc6cdf0f49435d5aec235Ted Kremenek 384a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek // Make sure that libcros is loaded and OOBE is complete. 3911062b118476368fa5b294954713e5df97d8599fTed Kremenek if (!WizardController::default_controller() || 405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis chromeos::StartupUtils::IsDeviceRegistered()) { 419ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek update_engine_client->RequestUpdateCheck( 425a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis base::Bind(&VersionUpdaterCros::OnUpdateCheck, 435fe4d9deb543a19f557e3d85c5f33867af97cd96Ted Kremenek weak_ptr_factory_.GetWeakPtr())); 4411062b118476368fa5b294954713e5df97d8599fTed Kremenek } 45cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek} 46cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek 47cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenekvoid VersionUpdaterCros::RelaunchBrowser() const { 48cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart(); 49cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek} 501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 51bda1efd0daf6fca9f515c6ce38d1ed71a3cca5b7Zhongxing Xuvoid VersionUpdaterCros::SetReleaseChannel(const std::string& channel) { 52bda1efd0daf6fca9f515c6ce38d1ed71a3cca5b7Zhongxing Xu DBusThreadManager::Get()->GetUpdateEngineClient()->SetReleaseTrack(channel); 53bda1efd0daf6fca9f515c6ce38d1ed71a3cca5b7Zhongxing Xu // For local owner set the field in the policy blob too. 54c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu if (UserManager::Get()->IsCurrentUserOwner()) 5538b02b912e1a55c912f603c4369431264d36a381Zhongxing Xu CrosSettings::Get()->SetString(chromeos::kReleaseChannel, channel); 56d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis} 57a19f4af7a94835ce4693bfe12d6270754e79eb56Anna Zaks 58d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidisvoid VersionUpdaterCros::GetReleaseChannel(const ChannelCallback& cb) { 59d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis channel_callback_ = cb; 60d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis 61e36de1fe51c39d9161915dd3dbef880954af6476Ted Kremenek // TODO(jhawkins): Store on this object. 621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UpdateEngineClient* update_engine_client = 631833d284346b9fa11aae4e6aa07381347c04745cJordan Rose DBusThreadManager::Get()->GetUpdateEngineClient(); 641833d284346b9fa11aae4e6aa07381347c04745cJordan Rose 651833d284346b9fa11aae4e6aa07381347c04745cJordan Rose // Request the channel information. Use the observer to track the help page 661833d284346b9fa11aae4e6aa07381347c04745cJordan Rose // handler and ensure it does not get deleted before the callback. 671833d284346b9fa11aae4e6aa07381347c04745cJordan Rose update_engine_client->GetReleaseTrack( 681833d284346b9fa11aae4e6aa07381347c04745cJordan Rose base::Bind(&VersionUpdaterCros::UpdateSelectedChannel, 691833d284346b9fa11aae4e6aa07381347c04745cJordan Rose weak_ptr_factory_.GetWeakPtr())); 701833d284346b9fa11aae4e6aa07381347c04745cJordan Rose} 711833d284346b9fa11aae4e6aa07381347c04745cJordan Rose 724c4cb527a44037d076da82ad9d12b4e655e64dbbTed KremenekVersionUpdaterCros::VersionUpdaterCros() 7346e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose : last_operation_(UpdateEngineClient::UPDATE_STATUS_IDLE), 7446e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose weak_ptr_factory_(this) { 7546e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose} 761833d284346b9fa11aae4e6aa07381347c04745cJordan Rose 774c4cb527a44037d076da82ad9d12b4e655e64dbbTed KremenekVersionUpdaterCros::~VersionUpdaterCros() { 78d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek UpdateEngineClient* update_engine_client = 794c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek DBusThreadManager::Get()->GetUpdateEngineClient(); 8046e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose update_engine_client->RemoveObserver(this); 8146e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose} 8246e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose 831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid VersionUpdaterCros::UpdateStatusChanged( 8446e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose const UpdateEngineClient::Status& status) { 851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Status my_status = UPDATED; 8646e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose int progress = 0; 871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump string16 message; 885d5480380d7b7c3590a0283ddf239220e514e576Ted Kremenek 891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If the updater is currently idle, just show the last operation (unless it 9046e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose // was previously checking for an update -- in that case, the system is 911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // up-to-date now). See http://crbug.com/120063 for details. 921833d284346b9fa11aae4e6aa07381347c04745cJordan Rose UpdateEngineClient::UpdateStatusOperation operation_to_show = status.status; 931833d284346b9fa11aae4e6aa07381347c04745cJordan Rose if (status.status == UpdateEngineClient::UPDATE_STATUS_IDLE && 941833d284346b9fa11aae4e6aa07381347c04745cJordan Rose last_operation_ != 959c378f705405d37f49795d5e915989de774fe11fTed Kremenek UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE) { 961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump operation_to_show = last_operation_; 971833d284346b9fa11aae4e6aa07381347c04745cJordan Rose } 981833d284346b9fa11aae4e6aa07381347c04745cJordan Rose 991833d284346b9fa11aae4e6aa07381347c04745cJordan Rose switch (operation_to_show) { 1001833d284346b9fa11aae4e6aa07381347c04745cJordan Rose case UpdateEngineClient::UPDATE_STATUS_ERROR: 1011833d284346b9fa11aae4e6aa07381347c04745cJordan Rose case UpdateEngineClient::UPDATE_STATUS_REPORTING_ERROR_EVENT: 102d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek // This path previously used the FAILED status and IDS_UPGRADE_ERROR, but 103d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek // the update engine reports errors for some conditions that shouldn't 1041833d284346b9fa11aae4e6aa07381347c04745cJordan Rose // actually be displayed as errors to users: http://crbug.com/146919. 105b38911f16b4943548db6a3695fc6ae23070b25d2Ted Kremenek // Just use the UPDATED status instead. 10646e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose break; 107f24af5bc2e01ca8e7396ed997378a77fddfa521eTed Kremenek case UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE: 1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump my_status = CHECKING; 1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump break; 1104a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek case UpdateEngineClient::UPDATE_STATUS_DOWNLOADING: 1114a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek progress = static_cast<int>(round(status.download_progress * 100)); 1124a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek // Fall through. 1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case UpdateEngineClient::UPDATE_STATUS_UPDATE_AVAILABLE: 1144323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek my_status = UPDATING; 1158bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek break; 1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case UpdateEngineClient::UPDATE_STATUS_VERIFYING: 1174a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek case UpdateEngineClient::UPDATE_STATUS_FINALIZING: 1184c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek // Once the download is finished, keep the progress at 100; it shouldn't 1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // go down while the status is the same. 1204a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek progress = 100; 1214c4cb527a44037d076da82ad9d12b4e655e64dbbTed Kremenek my_status = UPDATING; 122c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu break; 1234a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek case UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT: 124c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu my_status = NEARLY_UPDATED; 1255204d9e2fe0ea4e4b9c85087e355021c93221764Jordan Rose break; 1266800ba622e4edf287801ac69c42c61e7e294b06bAnna Zaks default: 12746e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose break; 12846e778145c56cd9b42cb399795a294b29cb78b62Jordan Rose } 129e40b69de464bc695afcaf7ef9602ad727d77b981Ted Kremenek 130e40b69de464bc695afcaf7ef9602ad727d77b981Ted Kremenek callback_.Run(my_status, progress, message); 131a5888f61be9f8d76e9b48a453dbced50523bd2e0Argyrios Kyrtzidis last_operation_ = status.status; 132c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu} 1334a0f5f1646637fcf90eb236b5a46f40e5a5dd739Ted Kremenek 1340f9063c116b7c3b05d8042b5976463c2dae04861Ted Kremenekvoid VersionUpdaterCros::OnUpdateCheck( 135c5619d901a68dc27a9e310a6a831f03efebcd950Zhongxing Xu UpdateEngineClient::UpdateCheckResult result) { 1361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If version updating is not implemented, this binary is the most up-to-date 1371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // possible with respect to automatic updating. 13825e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu if (result == UpdateEngineClient::UPDATE_RESULT_NOTIMPLEMENTED) 13925e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu callback_.Run(UPDATED, 0, string16()); 140955cd444f445bcdbade1cdd3926254c8ee7890d8Anna Zaks} 141955cd444f445bcdbade1cdd3926254c8ee7890d8Anna Zaks 142955cd444f445bcdbade1cdd3926254c8ee7890d8Anna Zaksvoid VersionUpdaterCros::UpdateSelectedChannel(const std::string& channel) { 143955cd444f445bcdbade1cdd3926254c8ee7890d8Anna Zaks channel_callback_.Run(channel); 1445032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu} 1455032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu