| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/login/screens/update_screen.h" | 5 #include "chrome/browser/chromeos/login/screens/update_screen.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 13 #include "base/threading/thread_restrictions.h" | 13 #include "base/threading/thread_restrictions.h" |
| 14 #include "chrome/browser/chromeos/login/error_screens_histogram_helper.h" | 14 #include "chrome/browser/chromeos/login/error_screens_histogram_helper.h" |
| 15 #include "chrome/browser/chromeos/login/screen_manager.h" | 15 #include "chrome/browser/chromeos/login/screen_manager.h" |
| 16 #include "chrome/browser/chromeos/login/screens/base_screen_delegate.h" | 16 #include "chrome/browser/chromeos/login/screens/base_screen_delegate.h" |
| 17 #include "chrome/browser/chromeos/login/screens/error_screen.h" | 17 #include "chrome/browser/chromeos/login/screens/error_screen.h" |
| 18 #include "chrome/browser/chromeos/login/screens/update_screen_actor.h" | 18 #include "chrome/browser/chromeos/login/screens/update_view.h" |
| 19 #include "chrome/browser/chromeos/login/startup_utils.h" | 19 #include "chrome/browser/chromeos/login/startup_utils.h" |
| 20 #include "chrome/browser/chromeos/login/wizard_controller.h" | 20 #include "chrome/browser/chromeos/login/wizard_controller.h" |
| 21 #include "chrome/grit/chromium_strings.h" |
| 22 #include "chrome/grit/generated_resources.h" |
| 21 #include "chromeos/dbus/dbus_thread_manager.h" | 23 #include "chromeos/dbus/dbus_thread_manager.h" |
| 22 #include "chromeos/network/network_state.h" | 24 #include "chromeos/network/network_state.h" |
| 23 #include "content/public/browser/browser_thread.h" | 25 #include "content/public/browser/browser_thread.h" |
| 26 #include "ui/base/l10n/l10n_util.h" |
| 24 | 27 |
| 25 using content::BrowserThread; | 28 using content::BrowserThread; |
| 26 using pairing_chromeos::HostPairingController; | 29 using pairing_chromeos::HostPairingController; |
| 27 | 30 |
| 28 namespace chromeos { | 31 namespace chromeos { |
| 29 | 32 |
| 30 namespace { | 33 namespace { |
| 31 | 34 |
| 35 // If reboot didn't happen, ask user to reboot device manually. |
| 36 const int kWaitForRebootTimeSec = 3; |
| 37 |
| 32 // Progress bar stages. Each represents progress bar value | 38 // Progress bar stages. Each represents progress bar value |
| 33 // at the beginning of each stage. | 39 // at the beginning of each stage. |
| 34 // TODO(nkostylev): Base stage progress values on approximate time. | 40 // TODO(nkostylev): Base stage progress values on approximate time. |
| 35 // TODO(nkostylev): Animate progress during each state. | 41 // TODO(nkostylev): Animate progress during each state. |
| 36 const int kBeforeUpdateCheckProgress = 7; | 42 const int kBeforeUpdateCheckProgress = 7; |
| 37 const int kBeforeDownloadProgress = 14; | 43 const int kBeforeDownloadProgress = 14; |
| 38 const int kBeforeVerifyingProgress = 74; | 44 const int kBeforeVerifyingProgress = 74; |
| 39 const int kBeforeFinalizingProgress = 81; | 45 const int kBeforeFinalizingProgress = 81; |
| 40 const int kProgressComplete = 100; | 46 const int kProgressComplete = 100; |
| 41 | 47 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 return (found != instance_set.end()); | 93 return (found != instance_set.end()); |
| 88 } | 94 } |
| 89 | 95 |
| 90 // static | 96 // static |
| 91 UpdateScreen* UpdateScreen::Get(ScreenManager* manager) { | 97 UpdateScreen* UpdateScreen::Get(ScreenManager* manager) { |
| 92 return static_cast<UpdateScreen*>( | 98 return static_cast<UpdateScreen*>( |
| 93 manager->GetScreen(WizardController::kUpdateScreenName)); | 99 manager->GetScreen(WizardController::kUpdateScreenName)); |
| 94 } | 100 } |
| 95 | 101 |
| 96 UpdateScreen::UpdateScreen(BaseScreenDelegate* base_screen_delegate, | 102 UpdateScreen::UpdateScreen(BaseScreenDelegate* base_screen_delegate, |
| 97 UpdateScreenActor* actor, | 103 UpdateView* view, |
| 98 HostPairingController* remora_controller) | 104 HostPairingController* remora_controller) |
| 99 : BaseScreen(base_screen_delegate), | 105 : UpdateModel(base_screen_delegate), |
| 100 state_(STATE_IDLE), | 106 state_(STATE_IDLE), |
| 101 reboot_check_delay_(0), | 107 reboot_check_delay_(kWaitForRebootTimeSec), |
| 102 is_checking_for_update_(true), | 108 is_checking_for_update_(true), |
| 103 is_downloading_update_(false), | 109 is_downloading_update_(false), |
| 104 is_ignore_update_deadlines_(false), | 110 is_ignore_update_deadlines_(true), |
| 105 is_shown_(false), | 111 is_shown_(false), |
| 106 ignore_idle_status_(true), | 112 ignore_idle_status_(true), |
| 107 actor_(actor), | 113 view_(view), |
| 108 remora_controller_(remora_controller), | 114 remora_controller_(remora_controller), |
| 109 is_first_detection_notification_(true), | 115 is_first_detection_notification_(true), |
| 110 is_first_portal_notification_(true), | 116 is_first_portal_notification_(true), |
| 111 histogram_helper_(new ErrorScreensHistogramHelper("Update")), | 117 histogram_helper_(new ErrorScreensHistogramHelper("Update")), |
| 112 weak_factory_(this) { | 118 weak_factory_(this) { |
| 113 DCHECK(actor_); | 119 if (view_) |
| 114 if (actor_) | 120 view_->Bind(*this); |
| 115 actor_->SetDelegate(this); | 121 |
| 116 GetInstanceSet().insert(this); | 122 GetInstanceSet().insert(this); |
| 117 } | 123 } |
| 118 | 124 |
| 119 UpdateScreen::~UpdateScreen() { | 125 UpdateScreen::~UpdateScreen() { |
| 126 if (view_) |
| 127 view_->Unbind(); |
| 128 |
| 120 DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this); | 129 DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this); |
| 121 NetworkPortalDetector::Get()->RemoveObserver(this); | 130 NetworkPortalDetector::Get()->RemoveObserver(this); |
| 122 GetInstanceSet().erase(this); | 131 GetInstanceSet().erase(this); |
| 123 if (actor_) | |
| 124 actor_->SetDelegate(NULL); | |
| 125 } | 132 } |
| 126 | 133 |
| 127 void UpdateScreen::UpdateStatusChanged( | 134 void UpdateScreen::UpdateStatusChanged( |
| 128 const UpdateEngineClient::Status& status) { | 135 const UpdateEngineClient::Status& status) { |
| 129 if (!actor_) | |
| 130 return; | |
| 131 | |
| 132 if (is_checking_for_update_ && | 136 if (is_checking_for_update_ && |
| 133 status.status > UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE) { | 137 status.status > UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE) { |
| 134 is_checking_for_update_ = false; | 138 is_checking_for_update_ = false; |
| 135 } | 139 } |
| 136 if (ignore_idle_status_ && status.status > | 140 if (ignore_idle_status_ && status.status > |
| 137 UpdateEngineClient::UPDATE_STATUS_IDLE) { | 141 UpdateEngineClient::UPDATE_STATUS_IDLE) { |
| 138 ignore_idle_status_ = false; | 142 ignore_idle_status_ = false; |
| 139 } | 143 } |
| 140 | 144 |
| 141 switch (status.status) { | 145 switch (status.status) { |
| 142 case UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE: | 146 case UpdateEngineClient::UPDATE_STATUS_CHECKING_FOR_UPDATE: |
| 143 // Do nothing in these cases, we don't want to notify the user of the | 147 // Do nothing in these cases, we don't want to notify the user of the |
| 144 // check unless there is an update. | 148 // check unless there is an update. |
| 145 SetHostPairingControllerStatus( | 149 SetHostPairingControllerStatus( |
| 146 HostPairingController::UPDATE_STATUS_UPDATING); | 150 HostPairingController::UPDATE_STATUS_UPDATING); |
| 147 break; | 151 break; |
| 148 case UpdateEngineClient::UPDATE_STATUS_UPDATE_AVAILABLE: | 152 case UpdateEngineClient::UPDATE_STATUS_UPDATE_AVAILABLE: |
| 149 MakeSureScreenIsShown(); | 153 MakeSureScreenIsShown(); |
| 150 actor_->SetProgress(kBeforeDownloadProgress); | 154 GetContextEditor() |
| 151 actor_->ShowEstimatedTimeLeft(false); | 155 .SetInteger(kContextKeyProgress, kBeforeDownloadProgress) |
| 156 .SetBoolean(kContextKeyShowEstimatedTimeLeft, false); |
| 152 if (!HasCriticalUpdate()) { | 157 if (!HasCriticalUpdate()) { |
| 153 VLOG(1) << "Noncritical update available: " << status.new_version; | 158 VLOG(1) << "Noncritical update available: " << status.new_version; |
| 154 ExitUpdate(REASON_UPDATE_NON_CRITICAL); | 159 ExitUpdate(REASON_UPDATE_NON_CRITICAL); |
| 155 } else { | 160 } else { |
| 156 VLOG(1) << "Critical update available: " << status.new_version; | 161 VLOG(1) << "Critical update available: " << status.new_version; |
| 157 actor_->SetProgressMessage( | 162 GetContextEditor() |
| 158 UpdateScreenActor::PROGRESS_MESSAGE_UPDATE_AVAILABLE); | 163 .SetString(kContextKeyProgressMessage, |
| 159 actor_->ShowProgressMessage(true); | 164 l10n_util::GetStringUTF16(IDS_UPDATE_AVAILABLE)) |
| 160 actor_->ShowCurtain(false); | 165 .SetBoolean(kContextKeyShowProgressMessage, true) |
| 166 .SetBoolean(kContextKeyShowCurtain, false); |
| 161 } | 167 } |
| 162 break; | 168 break; |
| 163 case UpdateEngineClient::UPDATE_STATUS_DOWNLOADING: | 169 case UpdateEngineClient::UPDATE_STATUS_DOWNLOADING: |
| 164 { | 170 { |
| 165 MakeSureScreenIsShown(); | 171 MakeSureScreenIsShown(); |
| 166 if (!is_downloading_update_) { | 172 if (!is_downloading_update_) { |
| 167 // Because update engine doesn't send UPDATE_STATUS_UPDATE_AVAILABLE | 173 // Because update engine doesn't send UPDATE_STATUS_UPDATE_AVAILABLE |
| 168 // we need to is update critical on first downloading notification. | 174 // we need to is update critical on first downloading notification. |
| 169 is_downloading_update_ = true; | 175 is_downloading_update_ = true; |
| 170 download_start_time_ = download_last_time_ = base::Time::Now(); | 176 download_start_time_ = download_last_time_ = base::Time::Now(); |
| 171 download_start_progress_ = status.download_progress; | 177 download_start_progress_ = status.download_progress; |
| 172 download_last_progress_ = status.download_progress; | 178 download_last_progress_ = status.download_progress; |
| 173 is_download_average_speed_computed_ = false; | 179 is_download_average_speed_computed_ = false; |
| 174 download_average_speed_ = 0.0; | 180 download_average_speed_ = 0.0; |
| 175 if (!HasCriticalUpdate()) { | 181 if (!HasCriticalUpdate()) { |
| 176 VLOG(1) << "Non-critical update available: " << status.new_version; | 182 VLOG(1) << "Non-critical update available: " << status.new_version; |
| 177 ExitUpdate(REASON_UPDATE_NON_CRITICAL); | 183 ExitUpdate(REASON_UPDATE_NON_CRITICAL); |
| 178 } else { | 184 } else { |
| 179 VLOG(1) << "Critical update available: " << status.new_version; | 185 VLOG(1) << "Critical update available: " << status.new_version; |
| 180 actor_->SetProgressMessage( | 186 GetContextEditor() |
| 181 UpdateScreenActor::PROGRESS_MESSAGE_INSTALLING_UPDATE); | 187 .SetString(kContextKeyProgressMessage, |
| 182 actor_->ShowProgressMessage(true); | 188 l10n_util::GetStringUTF16(IDS_INSTALLING_UPDATE)) |
| 183 actor_->ShowCurtain(false); | 189 .SetBoolean(kContextKeyShowProgressMessage, true) |
| 190 .SetBoolean(kContextKeyShowCurtain, false); |
| 184 } | 191 } |
| 185 } | 192 } |
| 186 UpdateDownloadingStats(status); | 193 UpdateDownloadingStats(status); |
| 187 } | 194 } |
| 188 break; | 195 break; |
| 189 case UpdateEngineClient::UPDATE_STATUS_VERIFYING: | 196 case UpdateEngineClient::UPDATE_STATUS_VERIFYING: |
| 190 MakeSureScreenIsShown(); | 197 MakeSureScreenIsShown(); |
| 191 actor_->SetProgress(kBeforeVerifyingProgress); | 198 GetContextEditor() |
| 192 actor_->SetProgressMessage(UpdateScreenActor::PROGRESS_MESSAGE_VERIFYING); | 199 .SetInteger(kContextKeyProgress, kBeforeVerifyingProgress) |
| 193 actor_->ShowProgressMessage(true); | 200 .SetString(kContextKeyProgressMessage, |
| 201 l10n_util::GetStringUTF16(IDS_UPDATE_VERIFYING)) |
| 202 .SetBoolean(kContextKeyShowProgressMessage, true); |
| 194 break; | 203 break; |
| 195 case UpdateEngineClient::UPDATE_STATUS_FINALIZING: | 204 case UpdateEngineClient::UPDATE_STATUS_FINALIZING: |
| 196 MakeSureScreenIsShown(); | 205 MakeSureScreenIsShown(); |
| 197 actor_->SetProgress(kBeforeFinalizingProgress); | 206 GetContextEditor() |
| 198 actor_->SetProgressMessage( | 207 .SetInteger(kContextKeyProgress, kBeforeFinalizingProgress) |
| 199 UpdateScreenActor::PROGRESS_MESSAGE_FINALIZING); | 208 .SetString(kContextKeyProgressMessage, |
| 200 actor_->ShowProgressMessage(true); | 209 l10n_util::GetStringUTF16(IDS_UPDATE_FINALIZING)) |
| 210 .SetBoolean(kContextKeyShowProgressMessage, true); |
| 201 break; | 211 break; |
| 202 case UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT: | 212 case UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT: |
| 203 MakeSureScreenIsShown(); | 213 MakeSureScreenIsShown(); |
| 204 actor_->SetProgress(kProgressComplete); | 214 GetContextEditor() |
| 205 actor_->ShowEstimatedTimeLeft(false); | 215 .SetInteger(kContextKeyProgress, kProgressComplete) |
| 216 .SetBoolean(kContextKeyShowEstimatedTimeLeft, false); |
| 206 if (HasCriticalUpdate()) { | 217 if (HasCriticalUpdate()) { |
| 207 actor_->ShowCurtain(false); | 218 GetContextEditor().SetBoolean(kContextKeyShowCurtain, false); |
| 208 VLOG(1) << "Initiate reboot after update"; | 219 VLOG(1) << "Initiate reboot after update"; |
| 209 SetHostPairingControllerStatus( | 220 SetHostPairingControllerStatus( |
| 210 HostPairingController::UPDATE_STATUS_REBOOTING); | 221 HostPairingController::UPDATE_STATUS_REBOOTING); |
| 211 DBusThreadManager::Get()->GetUpdateEngineClient()->RebootAfterUpdate(); | 222 DBusThreadManager::Get()->GetUpdateEngineClient()->RebootAfterUpdate(); |
| 212 reboot_timer_.Start(FROM_HERE, | 223 reboot_timer_.Start(FROM_HERE, |
| 213 base::TimeDelta::FromSeconds(reboot_check_delay_), | 224 base::TimeDelta::FromSeconds(reboot_check_delay_), |
| 214 this, | 225 this, |
| 215 &UpdateScreen::OnWaitForRebootTimeElapsed); | 226 &UpdateScreen::OnWaitForRebootTimeElapsed); |
| 216 } else { | 227 } else { |
| 217 ExitUpdate(REASON_UPDATE_NON_CRITICAL); | 228 ExitUpdate(REASON_UPDATE_NON_CRITICAL); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 if (!NetworkPortalDetector::Get()->IsEnabled()) { | 302 if (!NetworkPortalDetector::Get()->IsEnabled()) { |
| 292 StartUpdateCheck(); | 303 StartUpdateCheck(); |
| 293 return; | 304 return; |
| 294 } | 305 } |
| 295 state_ = STATE_FIRST_PORTAL_CHECK; | 306 state_ = STATE_FIRST_PORTAL_CHECK; |
| 296 is_first_detection_notification_ = true; | 307 is_first_detection_notification_ = true; |
| 297 is_first_portal_notification_ = true; | 308 is_first_portal_notification_ = true; |
| 298 NetworkPortalDetector::Get()->AddAndFireObserver(this); | 309 NetworkPortalDetector::Get()->AddAndFireObserver(this); |
| 299 } | 310 } |
| 300 | 311 |
| 301 void UpdateScreen::CancelUpdate() { | 312 void UpdateScreen::PrepareToShow() { |
| 302 VLOG(1) << "Forced update cancel"; | 313 if (!view_) |
| 303 ExitUpdate(REASON_UPDATE_CANCELED); | 314 return; |
| 315 |
| 316 view_->PrepareToShow(); |
| 304 } | 317 } |
| 305 | 318 |
| 306 void UpdateScreen::Show() { | 319 void UpdateScreen::Show() { |
| 307 is_shown_ = true; | 320 is_shown_ = true; |
| 308 histogram_helper_->OnScreenShow(); | 321 histogram_helper_->OnScreenShow(); |
| 309 if (actor_) { | 322 |
| 310 actor_->Show(); | 323 #if !defined(OFFICIAL_BUILD) |
| 311 actor_->SetProgress(kBeforeUpdateCheckProgress); | 324 GetContextEditor().SetBoolean(kContextKeyCancelUpdateShortcutEnabled, true); |
| 325 #endif |
| 326 GetContextEditor().SetInteger(kContextKeyProgress, |
| 327 kBeforeUpdateCheckProgress); |
| 328 |
| 329 if (view_) |
| 330 view_->Show(); |
| 331 } |
| 332 |
| 333 void UpdateScreen::Hide() { |
| 334 if (view_) |
| 335 view_->Hide(); |
| 336 is_shown_ = false; |
| 337 } |
| 338 |
| 339 void UpdateScreen::Initialize(::login::ScreenContext* context) { |
| 340 UpdateModel::Initialize(context); |
| 341 } |
| 342 |
| 343 void UpdateScreen::OnViewDestroyed(UpdateView* view) { |
| 344 if (view_ == view) |
| 345 view_ = nullptr; |
| 346 } |
| 347 |
| 348 void UpdateScreen::OnUserAction(const std::string& action_id) { |
| 349 #if !defined(OFFICIAL_BUILD) |
| 350 if (action_id == kUserActionCancelUpdateShortcut) |
| 351 CancelUpdate(); |
| 352 #endif |
| 353 } |
| 354 |
| 355 void UpdateScreen::OnContextKeyUpdated( |
| 356 const ::login::ScreenContext::KeyType& key) { |
| 357 UpdateModel::OnContextKeyUpdated(key); |
| 358 } |
| 359 |
| 360 void UpdateScreen::OnConnectToNetworkRequested() { |
| 361 if (state_ == STATE_ERROR) { |
| 362 LOG(WARNING) << "Hiding error message since AP was reselected"; |
| 363 StartUpdateCheck(); |
| 312 } | 364 } |
| 313 } | 365 } |
| 314 | 366 |
| 315 void UpdateScreen::Hide() { | |
| 316 if (actor_) | |
| 317 actor_->Hide(); | |
| 318 is_shown_ = false; | |
| 319 } | |
| 320 | |
| 321 std::string UpdateScreen::GetName() const { | |
| 322 return WizardController::kUpdateScreenName; | |
| 323 } | |
| 324 | |
| 325 void UpdateScreen::PrepareToShow() { | |
| 326 if (actor_) | |
| 327 actor_->PrepareToShow(); | |
| 328 } | |
| 329 | |
| 330 void UpdateScreen::ExitUpdate(UpdateScreen::ExitReason reason) { | 367 void UpdateScreen::ExitUpdate(UpdateScreen::ExitReason reason) { |
| 331 DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this); | 368 DBusThreadManager::Get()->GetUpdateEngineClient()->RemoveObserver(this); |
| 332 NetworkPortalDetector::Get()->RemoveObserver(this); | 369 NetworkPortalDetector::Get()->RemoveObserver(this); |
| 333 SetHostPairingControllerStatus(HostPairingController::UPDATE_STATUS_UPDATED); | 370 SetHostPairingControllerStatus(HostPairingController::UPDATE_STATUS_UPDATED); |
| 334 | 371 |
| 335 | 372 |
| 336 switch (reason) { | 373 switch (reason) { |
| 337 case REASON_UPDATE_CANCELED: | 374 case REASON_UPDATE_CANCELED: |
| 338 Finish(BaseScreenDelegate::UPDATE_NOUPDATE); | 375 Finish(BaseScreenDelegate::UPDATE_NOUPDATE); |
| 339 break; | 376 break; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 } | 408 } |
| 372 break; | 409 break; |
| 373 default: | 410 default: |
| 374 NOTREACHED(); | 411 NOTREACHED(); |
| 375 } | 412 } |
| 376 } | 413 } |
| 377 | 414 |
| 378 void UpdateScreen::OnWaitForRebootTimeElapsed() { | 415 void UpdateScreen::OnWaitForRebootTimeElapsed() { |
| 379 LOG(ERROR) << "Unable to reboot - asking user for a manual reboot."; | 416 LOG(ERROR) << "Unable to reboot - asking user for a manual reboot."; |
| 380 MakeSureScreenIsShown(); | 417 MakeSureScreenIsShown(); |
| 381 if (actor_) | 418 GetContextEditor().SetString(kContextKeyUpdateMessage, |
| 382 actor_->ShowManualRebootInfo(); | 419 l10n_util::GetStringUTF16(IDS_UPDATE_COMPLETED)); |
| 383 } | 420 } |
| 384 | 421 |
| 385 void UpdateScreen::MakeSureScreenIsShown() { | 422 void UpdateScreen::MakeSureScreenIsShown() { |
| 386 if (!is_shown_) | 423 if (!is_shown_) |
| 387 get_base_screen_delegate()->ShowCurrentScreen(); | 424 get_base_screen_delegate()->ShowCurrentScreen(); |
| 388 } | 425 } |
| 389 | 426 |
| 390 void UpdateScreen::SetRebootCheckDelay(int seconds) { | |
| 391 if (seconds <= 0) | |
| 392 reboot_timer_.Stop(); | |
| 393 DCHECK(!reboot_timer_.IsRunning()); | |
| 394 reboot_check_delay_ = seconds; | |
| 395 } | |
| 396 | |
| 397 void UpdateScreen::SetIgnoreIdleStatus(bool ignore_idle_status) { | 427 void UpdateScreen::SetIgnoreIdleStatus(bool ignore_idle_status) { |
| 398 ignore_idle_status_ = ignore_idle_status; | 428 ignore_idle_status_ = ignore_idle_status; |
| 399 } | 429 } |
| 400 | 430 |
| 431 void UpdateScreen::CancelUpdate() { |
| 432 VLOG(1) << "Forced update cancel"; |
| 433 ExitUpdate(REASON_UPDATE_CANCELED); |
| 434 } |
| 435 |
| 401 void UpdateScreen::UpdateDownloadingStats( | 436 void UpdateScreen::UpdateDownloadingStats( |
| 402 const UpdateEngineClient::Status& status) { | 437 const UpdateEngineClient::Status& status) { |
| 403 if (!actor_) | |
| 404 return; | |
| 405 base::Time download_current_time = base::Time::Now(); | 438 base::Time download_current_time = base::Time::Now(); |
| 406 if (download_current_time >= download_last_time_ + kMinTimeStep) { | 439 if (download_current_time >= download_last_time_ + kMinTimeStep) { |
| 407 // Estimate downloading rate. | 440 // Estimate downloading rate. |
| 408 double progress_delta = | 441 double progress_delta = |
| 409 std::max(status.download_progress - download_last_progress_, 0.0); | 442 std::max(status.download_progress - download_last_progress_, 0.0); |
| 410 double time_delta = | 443 double time_delta = |
| 411 (download_current_time - download_last_time_).InSecondsF(); | 444 (download_current_time - download_last_time_).InSecondsF(); |
| 412 double download_rate = status.new_size * progress_delta / time_delta; | 445 double download_rate = status.new_size * progress_delta / time_delta; |
| 413 | 446 |
| 414 download_last_time_ = download_current_time; | 447 download_last_time_ = download_current_time; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 430 status.new_size * | 463 status.new_size * |
| 431 (status.download_progress - download_start_progress_) / | 464 (status.download_progress - download_start_progress_) / |
| 432 time_delta; | 465 time_delta; |
| 433 } | 466 } |
| 434 double work_left = progress_left * status.new_size; | 467 double work_left = progress_left * status.new_size; |
| 435 double time_left = work_left / download_average_speed_; | 468 double time_left = work_left / download_average_speed_; |
| 436 // |time_left| may be large enough or even +infinity. So we must | 469 // |time_left| may be large enough or even +infinity. So we must |
| 437 // |bound possible estimations. | 470 // |bound possible estimations. |
| 438 time_left = std::min(time_left, kMaxTimeLeft); | 471 time_left = std::min(time_left, kMaxTimeLeft); |
| 439 | 472 |
| 440 actor_->ShowEstimatedTimeLeft(true); | 473 GetContextEditor() |
| 441 actor_->SetEstimatedTimeLeft( | 474 .SetBoolean(kContextKeyShowEstimatedTimeLeft, true) |
| 442 base::TimeDelta::FromSeconds(static_cast<int64>(time_left))); | 475 .SetInteger(kContextKeyEstimatedTimeLeftSec, |
| 476 static_cast<int>(time_left)); |
| 443 } | 477 } |
| 444 | 478 |
| 445 int download_progress = static_cast<int>( | 479 int download_progress = static_cast<int>( |
| 446 status.download_progress * kDownloadProgressIncrement); | 480 status.download_progress * kDownloadProgressIncrement); |
| 447 actor_->SetProgress(kBeforeDownloadProgress + download_progress); | 481 GetContextEditor().SetInteger(kContextKeyProgress, |
| 482 kBeforeDownloadProgress + download_progress); |
| 448 } | 483 } |
| 449 | 484 |
| 450 bool UpdateScreen::HasCriticalUpdate() { | 485 bool UpdateScreen::HasCriticalUpdate() { |
| 451 if (is_ignore_update_deadlines_) | 486 if (is_ignore_update_deadlines_) |
| 452 return true; | 487 return true; |
| 453 | 488 |
| 454 std::string deadline; | 489 std::string deadline; |
| 455 // Checking for update flag file causes us to do blocking IO on UI thread. | 490 // Checking for update flag file causes us to do blocking IO on UI thread. |
| 456 // Temporarily allow it until we fix http://crosbug.com/11106 | 491 // Temporarily allow it until we fix http://crosbug.com/11106 |
| 457 base::ThreadRestrictions::ScopedAllowIO allow_io; | 492 base::ThreadRestrictions::ScopedAllowIO allow_io; |
| 458 base::FilePath update_deadline_file_path(kUpdateDeadlineFile); | 493 base::FilePath update_deadline_file_path(kUpdateDeadlineFile); |
| 459 if (!base::ReadFileToString(update_deadline_file_path, &deadline) || | 494 if (!base::ReadFileToString(update_deadline_file_path, &deadline) || |
| 460 deadline.empty()) { | 495 deadline.empty()) { |
| 461 return false; | 496 return false; |
| 462 } | 497 } |
| 463 | 498 |
| 464 // TODO(dpolukhin): Analyze file content. Now we can just assume that | 499 // TODO(dpolukhin): Analyze file content. Now we can just assume that |
| 465 // if the file exists and not empty, there is critical update. | 500 // if the file exists and not empty, there is critical update. |
| 466 return true; | 501 return true; |
| 467 } | 502 } |
| 468 | 503 |
| 469 void UpdateScreen::OnActorDestroyed(UpdateScreenActor* actor) { | |
| 470 if (actor_ == actor) | |
| 471 actor_ = NULL; | |
| 472 } | |
| 473 | |
| 474 void UpdateScreen::OnConnectToNetworkRequested() { | |
| 475 if (state_ == STATE_ERROR) { | |
| 476 LOG(WARNING) << "Hiding error message since AP was reselected"; | |
| 477 StartUpdateCheck(); | |
| 478 } | |
| 479 } | |
| 480 | |
| 481 ErrorScreen* UpdateScreen::GetErrorScreen() { | 504 ErrorScreen* UpdateScreen::GetErrorScreen() { |
| 482 return get_base_screen_delegate()->GetErrorScreen(); | 505 return get_base_screen_delegate()->GetErrorScreen(); |
| 483 } | 506 } |
| 484 | 507 |
| 485 void UpdateScreen::StartUpdateCheck() { | 508 void UpdateScreen::StartUpdateCheck() { |
| 486 NetworkPortalDetector::Get()->RemoveObserver(this); | 509 NetworkPortalDetector::Get()->RemoveObserver(this); |
| 487 if (state_ == STATE_ERROR) | 510 if (state_ == STATE_ERROR) |
| 488 HideErrorMessage(); | 511 HideErrorMessage(); |
| 489 state_ = STATE_UPDATE; | 512 state_ = STATE_UPDATE; |
| 490 DBusThreadManager::Get()->GetUpdateEngineClient()->AddObserver(this); | 513 DBusThreadManager::Get()->GetUpdateEngineClient()->AddObserver(this); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 } | 562 } |
| 540 | 563 |
| 541 void UpdateScreen::SetHostPairingControllerStatus( | 564 void UpdateScreen::SetHostPairingControllerStatus( |
| 542 HostPairingController::UpdateStatus update_status) { | 565 HostPairingController::UpdateStatus update_status) { |
| 543 if (remora_controller_) { | 566 if (remora_controller_) { |
| 544 remora_controller_->OnUpdateStatusChanged(update_status); | 567 remora_controller_->OnUpdateStatusChanged(update_status); |
| 545 } | 568 } |
| 546 } | 569 } |
| 547 | 570 |
| 548 } // namespace chromeos | 571 } // namespace chromeos |
| OLD | NEW |