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