update_screen.h revision 2385ea399aae016c0806a4f9ef3c9cfe3d2a39df
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
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_UPDATE_SCREEN_H_
6#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_UPDATE_SCREEN_H_
7
8#include <set>
9
10#include "base/callback.h"
11#include "base/compiler_specific.h"
12#include "base/gtest_prod_util.h"
13#include "base/memory/weak_ptr.h"
14#include "base/time/time.h"
15#include "base/timer/timer.h"
16#include "chrome/browser/chromeos/login/screens/update_screen_actor.h"
17#include "chrome/browser/chromeos/login/screens/wizard_screen.h"
18#include "chrome/browser/chromeos/net/network_portal_detector.h"
19#include "chromeos/dbus/update_engine_client.h"
20
21namespace chromeos {
22
23class ErrorScreen;
24class NetworkState;
25class ScreenObserver;
26
27// Controller for the update screen. It does not depend on the specific
28// implementation of the screen showing (Views of WebUI based), the dependency
29// is moved to the UpdateScreenActor instead.
30class UpdateScreen: public UpdateEngineClient::Observer,
31                    public UpdateScreenActor::Delegate,
32                    public WizardScreen,
33                    public NetworkPortalDetector::Observer {
34 public:
35  UpdateScreen(ScreenObserver* screen_observer, UpdateScreenActor* actor);
36  virtual ~UpdateScreen();
37
38  // Overridden from WizardScreen.
39  virtual void PrepareToShow() OVERRIDE;
40  virtual void Show() OVERRIDE;
41  virtual void Hide() OVERRIDE;
42  virtual std::string GetName() const OVERRIDE;
43
44  // UpdateScreenActor::Delegate implementation:
45  virtual void CancelUpdate() OVERRIDE;
46  virtual void OnActorDestroyed(UpdateScreenActor* actor) OVERRIDE;
47  virtual void OnConnectToNetworkRequested(
48      const std::string& service_path) OVERRIDE;
49
50  // Starts network check. Made virtual to simplify mocking.
51  virtual void StartNetworkCheck();
52
53  // Reboot check delay get/set, in seconds.
54  int reboot_check_delay() const { return reboot_check_delay_; }
55  void SetRebootCheckDelay(int seconds);
56
57  // Returns true if this instance is still active (i.e. has not been deleted).
58  static bool HasInstance(UpdateScreen* inst);
59
60  void SetIgnoreIdleStatus(bool ignore_idle_status);
61
62  enum ExitReason {
63     REASON_UPDATE_CANCELED = 0,
64     REASON_UPDATE_INIT_FAILED,
65     REASON_UPDATE_NON_CRITICAL,
66     REASON_UPDATE_ENDED
67  };
68  // Reports update results to the ScreenObserver.
69  virtual void ExitUpdate(ExitReason reason);
70
71  // UpdateEngineClient::Observer implementation:
72  virtual void UpdateStatusChanged(
73      const UpdateEngineClient::Status& status) OVERRIDE;
74
75  // NetworkPortalDetector::Observer implementation:
76  virtual void OnPortalDetectionCompleted(
77      const NetworkState* network,
78      const NetworkPortalDetector::CaptivePortalState& state) OVERRIDE;
79
80 private:
81  FRIEND_TEST_ALL_PREFIXES(UpdateScreenTest, TestBasic);
82  FRIEND_TEST_ALL_PREFIXES(UpdateScreenTest, TestUpdateAvailable);
83  FRIEND_TEST_ALL_PREFIXES(UpdateScreenTest, TestAPReselection);
84
85  enum State {
86    STATE_IDLE = 0,
87    STATE_FIRST_PORTAL_CHECK,
88    STATE_UPDATE,
89    STATE_ERROR
90  };
91
92  // Updates downloading stats (remaining time and downloading
93  // progress) on the AU screen.
94  void UpdateDownloadingStats(const UpdateEngineClient::Status& status);
95
96  // Returns true if there is critical system update that requires installation
97  // and immediate reboot.
98  bool HasCriticalUpdate();
99
100  // Timer notification handlers.
101  void OnWaitForRebootTimeElapsed();
102
103  // Checks that screen is shown, shows if not.
104  void MakeSureScreenIsShown();
105
106  // Returns an instance of the error screen.
107  ErrorScreen* GetErrorScreen();
108
109  void StartUpdateCheck();
110  void ShowErrorMessage();
111  void HideErrorMessage();
112  void UpdateErrorMessage(
113      const NetworkState* network,
114      const NetworkPortalDetector::CaptivePortalStatus status);
115  // Timer for the interval to wait for the reboot.
116  // If reboot didn't happen - ask user to reboot manually.
117  base::OneShotTimer<UpdateScreen> reboot_timer_;
118
119  // Returns a static InstanceSet.
120  typedef std::set<UpdateScreen*> InstanceSet;
121  static InstanceSet& GetInstanceSet();
122
123  // Current state of the update screen.
124  State state_;
125
126  // Time in seconds after which we decide that the device has not rebooted
127  // automatically. If reboot didn't happen during this interval, ask user to
128  // reboot device manually.
129  int reboot_check_delay_;
130
131  // True if in the process of checking for update.
132  bool is_checking_for_update_;
133  // Flag that is used to detect when update download has just started.
134  bool is_downloading_update_;
135  // If true, update deadlines are ignored.
136  // Note, this is false by default.
137  bool is_ignore_update_deadlines_;
138  // Whether the update screen is shown.
139  bool is_shown_;
140  // Ignore fist IDLE status that is sent before update screen initiated check.
141  bool ignore_idle_status_;
142
143  // Keeps actor which is delegated with all showing operations.
144  UpdateScreenActor* actor_;
145
146  // Time of the first notification from the downloading stage.
147  base::Time download_start_time_;
148  double download_start_progress_;
149
150  // Time of the last notification from the downloading stage.
151  base::Time download_last_time_;
152  double download_last_progress_;
153
154  bool is_download_average_speed_computed_;
155  double download_average_speed_;
156
157  // True if there was no notification from NetworkPortalDetector
158  // about state for the default network.
159  bool is_first_detection_notification_;
160
161  // True if there was no notification about captive portal state for
162  // the default network.
163  bool is_first_portal_notification_;
164
165  base::WeakPtrFactory<UpdateScreen> weak_factory_;
166
167  DISALLOW_COPY_AND_ASSIGN(UpdateScreen);
168};
169
170}  // namespace chromeos
171
172#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_UPDATE_SCREEN_H_
173