update_screen.h revision 116680a4aac90f2aa7413d9095a592090648e557
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) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_UPDATE_SCREEN_H_ 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_UPDATE_SCREEN_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/weak_ptr.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/update_screen_actor.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/screens/wizard_screen.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/update_engine_client.h" 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/network/portal_detector/network_portal_detector.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ErrorScreen; 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class NetworkState; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScreenObserver; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Controller for the update screen. It does not depend on the specific 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementation of the screen showing (Views of WebUI based), the dependency 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is moved to the UpdateScreenActor instead. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UpdateScreen: public UpdateEngineClient::Observer, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public UpdateScreenActor::Delegate, 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public WizardScreen, 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public NetworkPortalDetector::Observer { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateScreen(ScreenObserver* screen_observer, UpdateScreenActor* actor); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~UpdateScreen(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from WizardScreen. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PrepareToShow() OVERRIDE; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Show() OVERRIDE; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Hide() OVERRIDE; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string GetName() const OVERRIDE; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateScreenActor::Delegate implementation: 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CancelUpdate() OVERRIDE; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnActorDestroyed(UpdateScreenActor* actor) OVERRIDE; 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnConnectToNetworkRequested() OVERRIDE; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Starts network check. Made virtual to simplify mocking. 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void StartNetworkCheck(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reboot check delay get/set, in seconds. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int reboot_check_delay() const { return reboot_check_delay_; } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetRebootCheckDelay(int seconds); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if this instance is still active (i.e. has not been deleted). 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool HasInstance(UpdateScreen* inst); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetIgnoreIdleStatus(bool ignore_idle_status); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ExitReason { 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) REASON_UPDATE_CANCELED = 0, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) REASON_UPDATE_INIT_FAILED, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) REASON_UPDATE_NON_CRITICAL, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) REASON_UPDATE_ENDED 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reports update results to the ScreenObserver. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ExitUpdate(ExitReason reason); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateEngineClient::Observer implementation: 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateStatusChanged( 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const UpdateEngineClient::Status& status) OVERRIDE; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // NetworkPortalDetector::Observer implementation: 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnPortalDetectionCompleted( 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const NetworkState* network, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const NetworkPortalDetector::CaptivePortalState& state) OVERRIDE; 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(UpdateScreenTest, TestBasic); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(UpdateScreenTest, TestUpdateAvailable); 822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch FRIEND_TEST_ALL_PREFIXES(UpdateScreenTest, TestAPReselection); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enum State { 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) STATE_IDLE = 0, 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) STATE_FIRST_PORTAL_CHECK, 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) STATE_UPDATE, 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) STATE_ERROR 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates downloading stats (remaining time and downloading 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // progress) on the AU screen. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateDownloadingStats(const UpdateEngineClient::Status& status); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if there is critical system update that requires installation 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and immediate reboot. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasCriticalUpdate(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Timer notification handlers. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnWaitForRebootTimeElapsed(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks that screen is shown, shows if not. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MakeSureScreenIsShown(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns an instance of the error screen. 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ErrorScreen* GetErrorScreen(); 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void StartUpdateCheck(); 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ShowErrorMessage(); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void HideErrorMessage(); 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void UpdateErrorMessage( 11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const NetworkState* network, 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const NetworkPortalDetector::CaptivePortalStatus status); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Timer for the interval to wait for the reboot. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If reboot didn't happen - ask user to reboot manually. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::OneShotTimer<UpdateScreen> reboot_timer_; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a static InstanceSet. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::set<UpdateScreen*> InstanceSet; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static InstanceSet& GetInstanceSet(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Current state of the update screen. 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) State state_; 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Time in seconds after which we decide that the device has not rebooted 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // automatically. If reboot didn't happen during this interval, ask user to 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reboot device manually. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int reboot_check_delay_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if in the process of checking for update. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_checking_for_update_; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Flag that is used to detect when update download has just started. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_downloading_update_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If true, update deadlines are ignored. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note, this is false by default. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_ignore_update_deadlines_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the update screen is shown. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_shown_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore fist IDLE status that is sent before update screen initiated check. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ignore_idle_status_; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keeps actor which is delegated with all showing operations. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateScreenActor* actor_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Time of the first notification from the downloading stage. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time download_start_time_; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double download_start_progress_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Time of the last notification from the downloading stage. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time download_last_time_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double download_last_progress_; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_download_average_speed_computed_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double download_average_speed_; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True if there was no notification from NetworkPortalDetector 15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // about state for the default network. 15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool is_first_detection_notification_; 15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True if there was no notification about captive portal state for 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the default network. 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_first_portal_notification_; 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::WeakPtrFactory<UpdateScreen> weak_factory_; 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UpdateScreen); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_UPDATE_SCREEN_H_ 172