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