15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/help/version_updater_chromeos.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cmath>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/browser_process.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/startup_utils.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/wizard_controller.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/webui/help/help_utils_chromeos.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/power_manager_client.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_handler.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_state.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_state_handler.h"
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/settings/cros_settings_names.h"
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h"
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using chromeos::CrosSettings;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using chromeos::DBusThreadManager;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using chromeos::UpdateEngineClient;
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)using user_manager::UserManager;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using chromeos::WizardController;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace {
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Network status in the context of device update.
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)enum NetworkStatus {
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // It's allowed in device policy to use current network for update.
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NETWORK_STATUS_ALLOWED = 0,
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // It's disallowed in device policy to use current network for update.
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NETWORK_STATUS_DISALLOWED,
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Device is in offline state.
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NETWORK_STATUS_OFFLINE
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const bool kDefaultAutoUpdateDisabled = false;
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)NetworkStatus GetNetworkStatus(const chromeos::NetworkState* network) {
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!network || !network->IsConnectedState())  // Offline state.
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NETWORK_STATUS_OFFLINE;
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // The connection type checking strategy must be the same as the one
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // used in update engine.
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (network->type() == shill::kTypeBluetooth)
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NETWORK_STATUS_DISALLOWED;
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (network->type() == shill::kTypeCellular &&
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      !help_utils_chromeos::IsUpdateOverCellularAllowed()) {
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return NETWORK_STATUS_DISALLOWED;
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return NETWORK_STATUS_ALLOWED;
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Returns true if auto-update is disabled by the system administrator.
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool IsAutoUpdateDisabled() {
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool update_disabled = kDefaultAutoUpdateDisabled;
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  chromeos::CrosSettings* settings = chromeos::CrosSettings::Get();
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!settings)
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return update_disabled;
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const base::Value* update_disabled_value =
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      settings->GetPref(chromeos::kUpdateDisabled);
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (update_disabled_value)
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    CHECK(update_disabled_value->GetAsBoolean(&update_disabled));
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return update_disabled;
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Returns whether an update is allowed. If not, it calls the callback with
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// the appropriate status.
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool EnsureCanUpdate(const VersionUpdater::StatusCallback& callback) {
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (IsAutoUpdateDisabled()) {
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    callback.Run(VersionUpdater::FAILED, 0,
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 l10n_util::GetStringUTF16(IDS_UPGRADE_DISABLED_BY_POLICY));
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  chromeos::NetworkStateHandler* network_state_handler =
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      chromeos::NetworkHandler::Get()->network_state_handler();
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const chromeos::NetworkState* network =
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      network_state_handler->DefaultNetwork();
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Don't allow an update if we're currently offline or connected
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // to a network for which updates are disallowed.
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NetworkStatus status = GetNetworkStatus(network);
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (status == NETWORK_STATUS_OFFLINE) {
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    callback.Run(VersionUpdater::FAILED_OFFLINE, 0,
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                  l10n_util::GetStringUTF16(IDS_UPGRADE_OFFLINE));
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else if (status == NETWORK_STATUS_DISALLOWED) {
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 message =
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        l10n_util::GetStringFUTF16(
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            IDS_UPGRADE_DISALLOWED,
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            help_utils_chromeos::GetConnectionTypeAsUTF16(network->type()));
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    callback.Run(VersionUpdater::FAILED_CONNECTION_TYPE_DISALLOWED, 0, message);
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciVersionUpdater* VersionUpdater::Create() {
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return new VersionUpdaterCros;
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid VersionUpdaterCros::GetUpdateStatus(const StatusCallback& callback) {
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  callback_ = callback;
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!EnsureCanUpdate(callback))
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateEngineClient* update_engine_client =
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DBusThreadManager::Get()->GetUpdateEngineClient();
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!update_engine_client->HasObserver(this))
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    update_engine_client->AddObserver(this);
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  this->UpdateStatusChanged(
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DBusThreadManager::Get()->GetUpdateEngineClient()->GetLastStatus());
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid VersionUpdaterCros::CheckForUpdate(const StatusCallback& callback) {
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  callback_ = callback;
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!EnsureCanUpdate(callback))
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  UpdateEngineClient* update_engine_client =
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DBusThreadManager::Get()->GetUpdateEngineClient();
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!update_engine_client->HasObserver(this))
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    update_engine_client->AddObserver(this);
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (update_engine_client->GetLastStatus().status !=
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      UpdateEngineClient::UPDATE_STATUS_IDLE) {
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    check_for_update_when_idle_ = true;
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  check_for_update_when_idle_ = false;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that libcros is loaded and OOBE is complete.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!WizardController::default_controller() ||
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      chromeos::StartupUtils::IsDeviceRegistered()) {
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    update_engine_client->RequestUpdateCheck(base::Bind(
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        &VersionUpdaterCros::OnUpdateCheck, weak_ptr_factory_.GetWeakPtr()));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VersionUpdaterCros::RelaunchBrowser() const {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid VersionUpdaterCros::SetChannel(const std::string& channel,
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                    bool is_powerwash_allowed) {
1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (user_manager::UserManager::Get()->IsCurrentUserOwner()) {
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // For local owner set the field in the policy blob.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CrosSettings::Get()->SetString(chromeos::kReleaseChannel, channel);
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DBusThreadManager::Get()->GetUpdateEngineClient()->
166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      SetChannel(channel, is_powerwash_allowed);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid VersionUpdaterCros::GetChannel(bool get_current_channel,
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                    const ChannelCallback& cb) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateEngineClient* update_engine_client =
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DBusThreadManager::Get()->GetUpdateEngineClient();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Request the channel information.
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  update_engine_client->GetChannel(get_current_channel, cb);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VersionUpdaterCros::VersionUpdaterCros()
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : last_operation_(UpdateEngineClient::UPDATE_STATUS_IDLE),
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      check_for_update_when_idle_(false),
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      weak_ptr_factory_(this) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VersionUpdaterCros::~VersionUpdaterCros() {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateEngineClient* update_engine_client =
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DBusThreadManager::Get()->GetUpdateEngineClient();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  update_engine_client->RemoveObserver(this);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VersionUpdaterCros::UpdateStatusChanged(
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const UpdateEngineClient::Status& status) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Status my_status = UPDATED;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int progress = 0;
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 message;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the updater is currently idle, just show the last operation (unless it
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // was previously checking for an update -- in that case, the system is
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // up-to-date now).  See http://crbug.com/120063 for details.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateEngineClient::UpdateStatusOperation operation_to_show = status.status;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status.status == UpdateEngineClient::UPDATE_STATUS_IDLE &&
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_operation_ !=
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    operation_to_show = last_operation_;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (operation_to_show) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UpdateEngineClient::UPDATE_STATUS_ERROR:
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UpdateEngineClient::UPDATE_STATUS_REPORTING_ERROR_EVENT:
20946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case UpdateEngineClient::UPDATE_STATUS_ATTEMPTING_ROLLBACK:
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // This path previously used the FAILED status and IDS_UPGRADE_ERROR, but
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the update engine reports errors for some conditions that shouldn't
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // actually be displayed as errors to users: http://crbug.com/146919.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Just use the UPDATED status instead.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE:
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      my_status = CHECKING;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UpdateEngineClient::UPDATE_STATUS_DOWNLOADING:
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      progress = static_cast<int>(round(status.download_progress * 100));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Fall through.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UpdateEngineClient::UPDATE_STATUS_UPDATE_AVAILABLE:
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      my_status = UPDATING;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UpdateEngineClient::UPDATE_STATUS_VERIFYING:
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UpdateEngineClient::UPDATE_STATUS_FINALIZING:
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Once the download is finished, keep the progress at 100; it shouldn't
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // go down while the status is the same.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      progress = 100;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      my_status = UPDATING;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT:
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      my_status = NEARLY_UPDATED;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback_.Run(my_status, progress, message);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_operation_ = status.status;
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (check_for_update_when_idle_ &&
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      status.status == UpdateEngineClient::UPDATE_STATUS_IDLE) {
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CheckForUpdate(callback_);
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VersionUpdaterCros::OnUpdateCheck(
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateEngineClient::UpdateCheckResult result) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If version updating is not implemented, this binary is the most up-to-date
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // possible with respect to automatic updating.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result == UpdateEngineClient::UPDATE_RESULT_NOTIMPLEMENTED)
252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    callback_.Run(UPDATED, 0, base::string16());
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
254