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; 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ScreenManager; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScreenObserver; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Controller for the update screen. It does not depend on the specific 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementation of the screen showing (Views of WebUI based), the dependency 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is moved to the UpdateScreenActor instead. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UpdateScreen: public UpdateEngineClient::Observer, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public UpdateScreenActor::Delegate, 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public WizardScreen, 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public NetworkPortalDetector::Observer { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateScreen(ScreenObserver* screen_observer, UpdateScreenActor* actor); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~UpdateScreen(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static UpdateScreen* Get(ScreenManager* manager); 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from WizardScreen. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void PrepareToShow() OVERRIDE; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Show() OVERRIDE; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Hide() OVERRIDE; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string GetName() const OVERRIDE; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateScreenActor::Delegate implementation: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CancelUpdate() OVERRIDE; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnActorDestroyed(UpdateScreenActor* actor) OVERRIDE; 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnConnectToNetworkRequested() OVERRIDE; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Starts network check. Made virtual to simplify mocking. 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void StartNetworkCheck(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reboot check delay get/set, in seconds. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int reboot_check_delay() const { return reboot_check_delay_; } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetRebootCheckDelay(int seconds); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if this instance is still active (i.e. has not been deleted). 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool HasInstance(UpdateScreen* inst); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetIgnoreIdleStatus(bool ignore_idle_status); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ExitReason { 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) REASON_UPDATE_CANCELED = 0, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) REASON_UPDATE_INIT_FAILED, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) REASON_UPDATE_NON_CRITICAL, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) REASON_UPDATE_ENDED 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reports update results to the ScreenObserver. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ExitUpdate(ExitReason reason); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // UpdateEngineClient::Observer implementation: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateStatusChanged( 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const UpdateEngineClient::Status& status) OVERRIDE; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // NetworkPortalDetector::Observer implementation: 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnPortalDetectionCompleted( 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const NetworkState* network, 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const NetworkPortalDetector::CaptivePortalState& state) OVERRIDE; 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(UpdateScreenTest, TestBasic); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(UpdateScreenTest, TestUpdateAvailable); 852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch FRIEND_TEST_ALL_PREFIXES(UpdateScreenTest, TestAPReselection); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enum State { 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) STATE_IDLE = 0, 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) STATE_FIRST_PORTAL_CHECK, 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) STATE_UPDATE, 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) STATE_ERROR 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates downloading stats (remaining time and downloading 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // progress) on the AU screen. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateDownloadingStats(const UpdateEngineClient::Status& status); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if there is critical system update that requires installation 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and immediate reboot. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasCriticalUpdate(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Timer notification handlers. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnWaitForRebootTimeElapsed(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks that screen is shown, shows if not. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MakeSureScreenIsShown(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns an instance of the error screen. 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ErrorScreen* GetErrorScreen(); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void StartUpdateCheck(); 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ShowErrorMessage(); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void HideErrorMessage(); 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void UpdateErrorMessage( 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const NetworkState* network, 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const NetworkPortalDetector::CaptivePortalStatus status); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Timer for the interval to wait for the reboot. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If reboot didn't happen - ask user to reboot manually. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::OneShotTimer<UpdateScreen> reboot_timer_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a static InstanceSet. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::set<UpdateScreen*> InstanceSet; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static InstanceSet& GetInstanceSet(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Current state of the update screen. 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) State state_; 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Time in seconds after which we decide that the device has not rebooted 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // automatically. If reboot didn't happen during this interval, ask user to 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reboot device manually. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int reboot_check_delay_; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if in the process of checking for update. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_checking_for_update_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Flag that is used to detect when update download has just started. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_downloading_update_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If true, update deadlines are ignored. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note, this is false by default. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_ignore_update_deadlines_; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the update screen is shown. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_shown_; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore fist IDLE status that is sent before update screen initiated check. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ignore_idle_status_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keeps actor which is delegated with all showing operations. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateScreenActor* actor_; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Time of the first notification from the downloading stage. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time download_start_time_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double download_start_progress_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Time of the last notification from the downloading stage. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time download_last_time_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double download_last_progress_; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_download_average_speed_computed_; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double download_average_speed_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True if there was no notification from NetworkPortalDetector 16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // about state for the default network. 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool is_first_detection_notification_; 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // True if there was no notification about captive portal state for 16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the default network. 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_first_portal_notification_; 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::WeakPtrFactory<UpdateScreen> weak_factory_; 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UpdateScreen); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_UPDATE_SCREEN_H_ 175