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