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